Bash中命令赋值变量后输出异常,如何获取正确结果xyz?
解决变量赋值与输出异常的问题
这里的核心问题出在单引号的嵌套使用和你对变量存储内容的需求上,我分两种常见场景给你解决办法:
场景1:想把命令本身存在变量里,执行变量时得到xyz
你原来的赋值语句里,外层用了单引号包裹整个命令,但awk '{print $8}'里又用了单引号——shell里单引号是不能直接嵌套的,这会导致shell错误解析你的命令,把单引号提前闭合,变量里存的内容混乱。
解决办法是转义内部的单引号,或者改用双引号包裹并处理好变量转义:
- 方法1:转义内部单引号
string='ps -ef | grep xyz | grep -v grep | grep -v ruby | awk '\''{print $8}'\''' # 执行变量里的命令,就能得到xyz $string - 方法2:用双引号包裹整个命令,转义
$8的$避免shell提前解析string="ps -ef | grep xyz | grep -v grep | grep -v ruby | awk '{print \$8}'" $string
场景2:想直接把命令的执行结果(也就是xyz)存在变量里,echo变量就输出xyz
如果你不需要存命令本身,而是要存命令跑出来的结果,那得用命令替换,把命令放在$()(推荐)或者反引号里:
# 用$()的写法(可读性更好,嵌套也不容易出错) string=$(ps -ef | grep xyz | grep -v grep | grep -v ruby | awk '{print $8}') echo $string # 这时候直接输出xyz
或者用反引号的写法(和上面效果一致,但嵌套时容易出问题):
string=`ps -ef | grep xyz | grep -v grep | grep -v ruby | awk '{print $8}'` echo $string
简单总结下:你原来的赋值错误是因为单引号嵌套导致shell解析混乱,根据你是要存命令还是存结果,选上面对应的方法就能解决问题啦。
内容的提问来源于stack exchange,提问作者Khanal Bhaskar
相关产品推荐
相关产品推荐

