2010-03-01 3 views
33

Я не уверен, как сделать if с несколькими тестами в оболочке. У меня возникли проблемы написания этого сценария:Использование if elif fi в сценариях оболочки

echo "You have provided the following arguments $arg1 $arg2 $arg3" 
if [ "$arg1" = "$arg2" && "$arg1" != "$arg3" ] 
then 
    echo "Two of the provided args are equal." 
    exit 3 
elif [ $arg1 = $arg2 && $arg1 = $arg3 ] 
then 
    echo "All of the specified args are equal" 
    exit 0 
else 
    echo "All of the specified args are different" 
    exit 4 
fi 

Проблема я получаю эту ошибку каждый раз, когда:

./compare.sh: [: отсутствует '] Команда»не найдена

+5

Достаточно нескольких комментаторов предложили использовать [[вместо [но это делает ваш скрипт bash-specific. У вас будет меньше проблем с обслуживанием и переносимостью, если вы сможете придерживаться простого старого синтаксиса оболочки Bourne (sh). –

ответ

25

sh интерпретирует && как оператор оболочки. Измените его на -a, это [ «s конъюнкция оператор:

[ "$arg1" = "$arg2" -a "$arg1" != "$arg3" ] 

Кроме того, вы всегда должны процитировать переменные, потому что [ запутывается, когда вы покидаете от аргументов.

5

Измените "[" на "[[" и "]" на "]]".

+1

Еще лучше, измените '[' to 'test' –

7

Используйте двойные скобки ...

if [[ expression ]]

+1

Отметим, что это решение, потому что '[[' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' это другое имя для 'test', и, следовательно, его синтаксис - см. 'man test' –

+4

Технически,' ['является встроенной оболочкой, но' [['является ключевым словом shell. В этом разница. –

+1

Итак, см. Результаты команд bash 'type [', 'type [[', 'help [' и 'help [['. – Apostle

2

У меня есть образец из вашего кода. Попробуйте следующее:

echo "*Select Option:*" 
echo "1 - script1" 
echo "2 - script2" 
echo "3 - script3 " 
read option 
echo "You have selected" $option"." 
if [ $option="1" ] 
then 
    echo "1" 
elif [ $option="2" ] 
then 
    echo "2" 
    exit 0 
elif [ $option="3" ] 
then 
    echo "3" 
    exit 0 
else 
    echo "Please try again from given options only." 
fi 

Это должно сработать. :) Ответ

+0

Gawd это выглядит изворотливым для меня. Почему нет 'then' after' else'? На самом деле это может быть не слишком причудливо, но вот как это выглядит, по сравнению с C. – Rolf

+0

пространство требуется после $ option и before = для запуска его в порядке, иначе каждый раз 1 – PiyusG

23

Джош Ли работает, но вы можете использовать оператор «& &» для лучшей читаемости, как это:

echo "You have provided the following arguments $arg1 $arg2 $arg3" 
if [ "$arg1" = "$arg2" ] && [ "$arg1" != "$arg3" ] 
then 
    echo "Two of the provided args are equal." 
    exit 3 
elif [ $arg1 = $arg2 ] && [ $arg1 = $arg3 ] 
then 
    echo "All of the specified args are equal" 
    exit 0 
else 
    echo "All of the specified args are different" 
    exit 4 
fi 
1

Это работает для меня,

# cat checking.sh 
#!/bin/bash 
echo "You have provided the following arguments $arg1 $arg2 $arg3" 
if [ "$arg1" = "$arg2" ] && [ "$arg1" != "$arg3" ] 
then 
    echo "Two of the provided args are equal." 
    exit 3 
elif [ $arg1 == $arg2 ] && [ $arg1 = $arg3 ] 
then 
    echo "All of the specified args are equal" 
    exit 0 
else 
    echo "All of the specified args are different" 
    exit 4 
fi 

# ./checking.sh 
You have provided the following arguments 
All of the specified args are equal 

Вы можете добавить «set -x» в скрипте для устранения неполадок,

Спасибо.

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