如何通过grep输出设置Bash变量?解决命令未找到错误
问题:从hg.ini提取变量并临时赋值执行命令
我有一个名为hg.ini的文本文件,内容如下:
$ cat hg.ini [hello goodbye] x=hello.world y=goodbye.cruel.cruel.world z=I.dont.know.why.you.say.goodbye.I.say.hello
我想从文件里提取变量赋值行,临时设置变量后执行命令——比如直接写x=hello.world echo $x是能正常输出hello.world的。
但我试了下面的命令,却报错x=hello.world: command not found,因为$()的输出被当成了命令,而非变量赋值:
$(grep x= hg.ini|tr -d '\r\n') echo $x
请问有什么可行的替代方法?
解决方案
方法1:用eval执行拼接后的完整指令
把提取到的变量赋值和要执行的命令拼在一起,交给eval处理:
eval "$(grep x= hg.ini | tr -d '\r\n') echo \$x"
这里$(...)会提取出x=hello.world,和echo $x拼接成完整的命令串。注意要把$x转义成\$x,避免被Shell提前展开,确保eval执行时才解析变量。
方法2:利用子Shell的环境变量传递
用bash -c启动子Shell,把提取到的变量赋值作为子Shell的环境变量:
$(grep x= hg.ini | tr -d '\r\n') bash -c 'echo $x'
Bash会自动把前置的x=hello.world当作子Shell的临时环境变量,子Shell里的echo $x就能正常读取到值。
方法3:临时导入变量到当前Shell(可选)
如果需要多次使用这个变量,可以先把它导入当前Shell环境:
source <(grep x= hg.ini | tr -d '\r\n') echo $x
要是不想污染当前Shell的变量环境,就用子Shell包裹起来:
( source <(grep x= hg.ini | tr -d '\r\n'); echo $x )
内容的提问来源于stack exchange,提问作者Wes
相关产品推荐
相关产品推荐

