Bash中URL编码变量仅能echo一次,值丢失问题求助
问题原因
你的变量赋值语法完全错误,导致urlencode的输出根本没被存入K1:
K1=eval /usr/bin/urlencode "$1"这种写法中,Shell会将K1=eval设为临时环境变量,仅在执行/usr/bin/urlencode "$1"时生效,该命令的输出会直接打印到终端,而当前Shell环境下的K1并未被赋值。- 你看到第一个
echo "$K1"能打印编码结果,实际是前面urlencode命令的直接输出,和echo本身无关;第二个echo才是真正输出未赋值的K1,因此为空。 - 当你将
K1用于K2="zgrep $K1$DIR"时,由于K1为空,K2自然仅保留zgrep $DIR的内容。
解决办法
要捕获命令输出并赋值给变量,必须使用命令替换语法,推荐两种写法:
- 使用
$()(可读性更强,支持嵌套):
#!/bin/bash K1=$(/usr/bin/urlencode "$1") echo "$K1" # 正常打印编码后的参数 echo "$K1" # 重复输出依然有效 # 后续使用示例 DIR="/path/to/dir" K2="zgrep $K1$DIR" echo "$K2"
- 使用反引号
`(旧语法,不建议嵌套场景使用):
K1=`/usr/bin/urlencode "$1"`
注意:原代码中的eval是多余的,此处无需使用该命令。
内容的提问来源于stack exchange,提问作者Daniel Franco
相关产品推荐
相关产品推荐

