Проверка того, что файл доступен для чтения и существует в одном условии if: if [[ -r -f /file.png ]]

Я писал оператор if, который проверял, доступен ли файл для чтения и существует ли, выполнив следующие действия:

if [[ -r "$upFN" && -f "$upFN" ]]; then
....
fi

Тогда я подумал, сурово, вы можете сделать это меньше, что-то вроде этого:

if [[ -r -f "$upFN" ]]; then
....
fi

Но это не работает, выдает ошибки:

./ftp.sh: line 72: syntax error in conditional expression
./ftp.sh: line 72: syntax error near `"$upFN"'
./ftp.sh: line 72: `if [[ -r -f "$upFN" ]]; then'

person Mint    schedule 11.01.2011    source источник
comment
-f для файлов, -d для каталогов.   -  person dreamlax    schedule 11.01.2011
comment
Ой, не хотел иметь /folder/ в заголовке :P   -  person Mint    schedule 11.01.2011


Ответы (2)


AFAICT, нет возможности объединить их дальше. Обратите внимание на переносимость: [[ expr ]] менее переносим, ​​чем [ expr ] или test expr. && и || в стиле C включены только в bash, поэтому вы можете рассмотреть возможность использования синтаксиса POSIX -a для и и -o для или. Лично я предпочитаю использовать test expr, так как это очень явно. Многие оболочки (включая bash) включают для него встроенную функцию, поэтому вам не нужно беспокоиться о накладных расходах на создание процесса.

В любом случае, я бы переписал ваш тест как:

if test -r "$upFN" -a -f "$upFN"
then
  ...
fi

Этот синтаксис будет работать в традиционной оболочке Bourne, Korn и Bash. Вы также можете использовать синтаксис [ для переносимости.

person D.Shawley    schedule 11.01.2011
comment
Я всегда думал, что [[ expr ]] безопаснее, чем [ expr ] при использовании в них переменных. Я не знал, что || и && работают только в bash, теперь будут использовать -a -o, как вы предложили. Ваше здоровье - person Mint; 11.01.2011
comment
Итак, когда следует использовать специфические функции Bash? - person Dennis Williamson; 11.01.2011

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

person Rob Kennedy    schedule 11.01.2011
comment
-r проверяет удобочитаемость и -f проверяет существование файла. Часть -r может быть успешной для каталога, а часть -f завершится ошибкой. В сообщении не упоминалось, что -f требует, чтобы элемент был файлом. -e проверяет наличие. - person D.Shawley; 11.01.2011
comment
Я думал, что -f и -r никогда не удастся, если файл не существует, никогда не слышал о -e, придется проверить человека. - person Mint; 11.01.2011
comment
Я только что понял, что есть случай, когда -r <file> верно, а -f <file> && -r <file> нет: для читаемого каталога. - person Oliv; 01.06.2016
comment
Да, @Олив. Именно на это указал Д. Шоули — различие между -f и -e. Я не думаю, что это важное различие в данном случае, потому что я думаю, что Минт все время считал, что -f ведет себя как -e. То есть я думаю, что первоначальное использование -f было ошибкой. - person Rob Kennedy; 01.06.2016
comment
Я понял, что файл может существовать, но у вас может не быть прав на чтение. Пример: /var/log/secure. - person Erik Bennett; 09.09.2017