【问题标题】:Error with command substitution, bash and pipes命令替换、bash 和管道出错
【发布时间】:2014-06-07 12:20:15
【问题描述】:

使用 CentOS 6.4

执行:

var1=$(softnas-cmd checkupdate | jq .success)

给我一​​个错误:

"parse error: Invalid numeric literal at line 1, column 9"

如果我执行 var1=$(softnas-cmd checkupdate) 后跟 echo $var1 我得到:

{"success" : true, "session_id" : 1935, "result" : {"success":true,"msg":"You are running the latest version","records":{"version":"2.1.3.el6.x86_64","newversion":"2.1.3.el6.x86_64","updateavailable":false,"msg":"You are running the latest version"},"total":4}}

如果我然后执行 var2=$(echo $var1 | jq .success) 这有效,我得到了预期: 真的

最终我想这样做:

if [ $(softnas-cmd checkupdate | jq .succcess) = "true" ]; then
   echo "update required"
   ...
fi;

谁能告诉我如何格式化命令替换,以便我可以一次性执行?

谢谢

【问题讨论】:

  • var1=$(softnas-cmd checkupdate) 后跟 echo "$var1"(注意双引号!)打印什么?
  • [ec2-user@ip-10-0-10-145 ~]$ var1=$(softnas-cmd checkupdate) [ec2-user@ip-10-0-10-145 ~] $ echo "var1$" var1$ [ec2-user@ip-10-0-10-145 ~]$ [ec2-user@ip-10-0-10-145 ~]$ echo $var1 {"成功" : true, "session_id" : 32270, "result" : {"success":true,"msg":"你正在运行最新版本","re​​cords":{"version":"2.1.3.el6.x86_64" ,"newversion":"2.1.3.el6.x86_64","updateavailable":false,"msg":"你运行的是最新版本"},"total":4}} [ec2-user@ip-10 -0-10-145 ~]$

标签: linux bash command substitution


【解决方案1】:

您是否尝试解析字符串“updatevailable”之后的真/假?如果是这样,试试这个:

res=`softnas-cmd checkupdate | sed -n "s/.*updateavailable\":\([tf][a-z]*\),.*/\1/p"`; 
if [ "$res" == "true" ]; then 
    echo "update required" ... 
fi;

但是,如果您尝试在第一个“成功”字符串之后解析真/假,那么:

res=`softnas-cmd checkupdate | sed -n "s/.*\"success\" : \([tf][a-z]*\), .*/\1/p"`; 
if [ "$res" == "true" ]; then 
    echo "update required" ... 
fi;

解析第二个“成功”字符串将是:

res=`softnas-cmd checkupdate | sed -n "s/.*\"success\":\([tf][a-z]*\), .*/\1/p"`; 
if [ "$res" == "true" ]; then 
    echo "update required" ... 
fi;

【讨论】:

  • 我正在尝试执行您的第一个建议,解析出“updateavaialble”值。当我尝试您的建议时, $res 会留下一个空值。但是,如果我分配 res=softnas-cmd checkupdate,然后分配 res=echo $res | sed ...,则 $res 包含预期值,因此您的建议似乎遇到了我在使用 jq 库时遇到的相同问题
  • 如果字符串是您发布的字符串,它应该可以工作。我复制到一个文件并通过做一只猫从那里测试它。可能是您的脚本向 stderr 而不是 stdout 提供输出?如果是这样,请尝试 softnas-cmd checkupdate 2>&1 | sed ....
猜你喜欢
  • 2011-11-07
  • 2016-06-18
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多