ошибка сценария unix - PullRequest
       19

ошибка сценария unix

1 голос
/ 31 января 2012

У меня есть следующая строка в моем файле сценария unix:

if [[ -f $DIR1/$FILE1 ] -a [ -f $DIR1/$FILE2 ]]; then

Как ясно, строка проверяет наличие двух файлов в каталоге и, если оба файла присутствуют, некоторая логика будет выполнена.

Тем не менее, при запуске скрипта я получаю следующую ошибку в строке выше:

test_script: line 30: syntax error at line 54: `]' unexpected

строка 54 - это место, где присутствует строка выше.

Что означает эта ошибка?Где я не прав?

Спасибо за чтение!

Ответы [ 5 ]

1 голос
/ 31 января 2012

Интересно, что есть несколько ответов, объясняющих тонкие различия между [и [[, но по какой-то причине наша культура, кажется, препятствует людям предлагать очевидное решение. Прекратите использовать '[' полностью. Вместо '[' используйте test:

if test -f $DIR1/$FILE1 && test -f $DIR1/$FILE2; then

Тест - это более чистый синтаксис, чем '[', который требует заключительного аргумента ']' и постоянно вводит людей в заблуждение, что квадратные скобки являются частью языка. '[[' не является переносимым устройством и сбивает с толку людей, которые не понимают, что многие оболочки предоставляют дополнительную нестандартную функциональность. Можно привести аргумент, что [[может быть более эффективным, чем [, но если производительность оболочки является проблемой в вашей оболочке, вам, вероятно, не стоит решать проблему в sh.

1 голос
/ 31 января 2012

Нет необходимости в [] с -f.

if [ -f $DIR1/$FILE1 -a -f $DIR1/$FILE2 ]; then

Вывод:

shadyabhi@archlinux /tmp $ touch foo;touch foo2
shadyabhi@archlinux /tmp $ if [ -f "foo"  -a -f "foo2" ]; then echo "Hello"; fi
Hello
shadyabhi@archlinux /tmp $
1 голос
/ 31 января 2012

По крайней мере, для наиболее распространенных оболочек [] не похожи на круглые скобки в C, где вы затем используете их для группировки подвыражений.

Вам нужно что-то вроде (для bash):

if [[ -f $DIR1/$FILE1 && -f $DIR1/$FILE2 ]]; then

Если вам нужна помощь с определенной (не bash) оболочкой, сообщите нам, какой из них вы используете.

0 голосов
/ 13 апреля 2017

Как сказал @paxdiablo, вы можете использовать его следующим образом:

if  -f $DIR1/$FILE1 && -f $DIR1/$FILE2 ; then

или вы можете использовать его следующим образом:

if -f $DIR1/$FILE || -f $DIR1/$FILE2 ;
0 голосов
/ 31 января 2012

у вас были дополнительные [ и ]

if [ -f $DIR1/$FILE1 -a -f $DIR1/$FILE2 ]; then

По сути, вы смешивали два синтаксиса, которые нацелены на одно и то же: а именно [ ] и [[ ]]. Первый более портативный, а второй более мощный; хотя большинство оболочек, с которыми вы столкнетесь, поддерживают [[ ]].

Но еще лучше следующее, поскольку вы уже используете конструкцию [[ ]]

if [[ -f $DIR1/$FILE1 && -f $DIR1/$FILE2 ]]; then
...