Ошибка с подстановкой команд, bash и pipe

Использование 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), это сработает, и я получу ожидаемое: true

в конечном итоге я хочу сделать это:

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

может ли кто-нибудь сказать мне, как отформатировать подстановку команд, чтобы я мог выполнить ее одним выстрелом?

Спасибо


person Scott Kellish    schedule 22.04.2014    source источник
comment
Что печатает var1=$(softnas-cmd checkupdate), за которым следует echo "$var1" (обратите внимание на двойные кавычки!)?   -  person Gordon Davisson    schedule 23.04.2014
comment
[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 {успех: истина, session_id: 32270, результат: {успех: истина ,msg:Вы используете последнюю версию,записи:{версия:2.1.3.el6.x86_64,новая версия:2.1.3.el6.x86_64,доступно обновление:false,msg:Вы используете последнюю версию},всего:4 }} [ec2-user@ip-10-0-10-145 ~]$   -  person Scott Kellish    schedule 23.04.2014


Ответы (1)


Вы пытаетесь проанализировать true/false после строки «updatevailable»? Если это так, попробуйте это:

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

если вы, однако, пытаетесь проанализировать true/false после первой строки «успех», то:

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;
person NotANumber    schedule 22.04.2014
comment
Я пытаюсь выполнить ваше первое предложение, разобрать значение «updateavaialble». Когда я пробую ваше предложение, $res остается с нулевым значением. Однако, если я назначу res=softnas-cmd checkupdate, а затем res=echo $res | sed ..., $res содержит ожидаемое значение, поэтому кажется, что в вашем предложении возникает та же проблема, с которой я столкнулся при использовании библиотеки jq. - person Scott Kellish; 23.04.2014
comment
Если строка та, которую вы опубликовали, она должна работать. Я скопировал в файл и протестировал его оттуда, выполнив кат. Может быть, ваш скрипт выводит вывод на стандартный вывод, а не на стандартный вывод? если да, попробуйте softnas-cmd checkupdate 2›&1 | сед .... - person NotANumber; 23.04.2014