2014-01-28 4 views
-2

Я пытаюсь создать оператор if с тремя выражениями. Это то, что я пытался, но не работает:если оператор с 3 выражениями в оболочке

if [ $a = $b -a $c -gt $d ] || [ $a = $f ]; 

С выше выражения, если $a = $f он не выполняет тело, если заявление. Это возможно? Я пробовал разные комбинации, и никто не работает.

EDIT:

Вот мой полный пример по запросу:

a=9.3 
c=9.3.0 
q=/a/b/c/d ${a} 
if [ "${a}" = "9.2" -a ${c:4:4} -ge 4 ] || [ "${a}" = "9.3" ] 
then 
    q=/a/b/d ${a} 
fi 

Это работало, прежде чем я добавил || [ "${a}" = "9.3" ]

+1

Работает нормально с 'a = 1 b = 1 f = 1 c = 2 d = 3' –

+1

Кажется, работает и для меня, можете ли вы попробовать опубликовать полный исполняемый пример, включая значения переменных? –

+0

@GavinSmith Я обновил свой вопрос – user972276

ответ

1

Ваше состояние, если это хорошо. Проблема связана с вашими заданиями.

Это:

a=9.3 
q=/a/b/c/d ${a} 

не заставит назначить /a/b/c/d 9.3 переменной q.

Он попытается выполнить команду с именем 9.3 и присвоить ей временную переменную q=/a/b/c/d.

Запуск этого скрипта приводит к двум ошибкам, которые говорят 9.3: command not found. Не игнорируйте ошибки или неожиданный вывод. Они важны для обнаружения и диагностики проблем.

Я не знаю точно, что ваши намерения, но вы можете иметь в виду:

a=9.3 
c=9.3.0 
q="https://stackoverflow.com/a/b/c/d ${a}" 
if [ "${a}" = "9.2" -a ${c:4:4} -ge 4 ] || [ "${a}" = "9.3" ] 
then 
    q="https://stackoverflow.com/a/b/d ${a}" 
fi 

После выполнения этого кода, вы можете сделать echo "$q" и он будет говорить /a/b/d 9.3, как вы могли бы ожидать, что показывает что тогда была занята ветка.

+0

+1, но вы также должны указать, что (a) использование '[[...]]' предпочтительнее, чем '[...]' в bash вообще и что '-a' (и' -o') в '[...]' нестандартны; используйте '&&' и '||' в '[[...]]' вместо этого - см. http://mywiki.wooledge.org/BashGuide/TestsAndConditionals. – mklement0

Смежные вопросы