2013-05-27 6 views
1

Я пытался преобразовать следующий код, чтобы использовать «тест» вместо «если»использовать несколько условий в команде «Test»

if [ -e ./blah ] && [ ! -L ./blah ]; 
then 
    exit 1 
fi 

Мое намерение состоит в том, чтобы использовать тест вместо этого, так что я не имею для выхода 1 явно. Я пытаюсь что-то вроде этого:

test -e ./blah && ! -L ./blah; 

вместо & &, я попробовал -a, с различными комбинациями скобок, но я не увенчались успехом. Я уверен, что должен быть простой способ сделать это. Может кто-нибудь мне помочь ?

ответ

5

test не понимает логических операторов && и ||. Вы можете использовать test -e ./blah -a ! -L ./blah, но если вы используете Баш, вы можете переключиться на его более мощный [[ .. ]] конструкции:

[[ -e ./blah && ! -L ./blah ]] 
1

Вы можете объединить их все (в том числе, если затем фи):

[[ -e ./blah && ! -L ./blah ]] && exit 1 
1

Использование [[ ключевое слово, поскольку оно более мощное.

if [[ -e ./blah && ! -L ./blah ]] 
    then 
    ... 
fi 

Однако для обеспечения переносимости, вы можете сделать что-то вроде этого слишком

if [ -e ./blah ] && [ ! -L ./blah ] 
    then 
    ...do something 
fi 
1

Как вы просите, чтобы использовать test, вы можете сделать так:

test -e ./blah && test -L ./blah || (echo 'First action' ; echo 'Second action) 

Различные операторы (&&, || и т. Д.) Сначала анализируются оболочкой, поэтому вы не можете использовать ее в параметрах команд.

1
if [ -e ./blah ] && [ ! -L ./blah ]; 

эквивалентно

if test -e ./blah && test ! -L ./blah; 

Таким образом, вы можете просто написать

test -e ./blah && test ! -L ./blah 

именно:

$ help [\[] | tail -n +3 
[: [ arg... ] 
    Evaluate conditional expression. 

    This is a synonym for the "test" builtin, but the last argument must 
    be a literal `]', to match the opening `['. 
1

Выполните следующие действия:

$ ls -i /bin/test 
54008404 /bin/test 
$ ls -i /bin/[ 
54008404 /bin/test 

Это 54008404inode номер. Это настоящее имя файла./bin/test просто указывает на inode, а inode содержит всю информацию о файле.

Следует отметить, что /bin/[ и /bin/test такие же inode. Это означает, что они - одна и та же команда.

Таким образом:

if [ -f "$foo" ] 

так же, как:

if test -f "$foo" 

Команда if выполняет команду, а затем выполнит пункт if, если команда возвращает истину и не выполняет предложение, если команда false.

Например:

if grep -q "foo" $foo 
then 
    echo "File $foo contains the regular expression /foo/" 
fi 

полностью действительным. grep -q команда (во многих вариантах grep означает поиск регулярного выражения, и если регулярное выражение в файле, возвращает код выхода 0 (что означает, что команда успешно и верно).

Примечания есть нет квадратных скобок.

команды test (или [...]) просто выполняет тест, как указано, и возвращается с кодом выхода из 0 (таким образом, команда имеет успех), если тест верно. это все, что он делает.

Вы также можете увидеть эту конструкцию:

[ "$foo" = "$bar" ] && echo "$foo is equal to $bar" 

&& означает, что следующая команда (и возвращает код выхода), если первая команда возвращает код выхода из нуля. В противном случае просто верните код выхода первой команды.

Таким образом:

if [ -e ./blah ] && [ ! -L ./blah ]; 

говорит пробег test -e ./blah и если это верно (то есть, файл существует) выполнить test ! -L ./blah и если это также верно, запустите пункт заявления if.

Обратите внимание, что [ -e ./blah] и [ ! -L ./blah ] - это две отдельные команды. В && строки вместе две команды:

[ "$foo" = "$bar" ] && some_command; 

Это говорит, запустить test "$foo" = "$bar" и если это так, то выполните команду some_command. Обратите внимание, что это эквивалентно:

if [ "$foo" = "$bar" ] 
then 
    some_command 
fi 

Другая структура список является ||. Это означает, что если первая команда завершится успешно, верните код выхода 0 и не запустите вторую команду.Таким образом:

[ "$foo" = "$bar" ] || some_command; 

То же самое, как:

if [ "$foo" = "$bar" ] 
then 
    : 
else 
    some_command 
fi 

Давайте вернемся к вашему _original вопрос:

if [ -e ./blah ] && [ ! -L ./blah ]; 
then 
    exit 1 
fi 

То же самое, как:

if test -e ./blah && test ! -L ./blah 
then 
    exit 1 
fi 

Который является то же, что и

test -e ./blah && test ! -L ./blah && exit 1 

Это означает: Если test -e ./blah истинно (./blah файл), а затем выполнить команду после оператора && списка. Это test -! -L ./blah. Если этот тест также верен, снова запустите команду после оператора списка &&.

Это также может быть переписано в виде:

test -e ./blah && test -L ./blah || exit 1 

Это говорит о том, что если test -e ./blah верно, выполните команду после оператора && списка. Если test -L ./blah неверно, запустите команду после оператора ||.

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