Я'использовал следующий скрипт для проверки существования файла:
#!/bin/bash
FILE=$1
if [ -f $FILE ]; then
echo "File $FILE exists."
else
echo "File $FILE does not exist."
fi
Какой правильный синтаксис следует использовать, если я хочу проверить, не существует ли файл?
#!/bin/bash
FILE=$1
if [ $FILE does not exist ]; then
echo "File $FILE does not exist."
fi
Команда test ([
здесь) имеет логический оператор "not", который представляет собой восклицательный знак (как и во многих других языках). Попробуйте это:
if [ ! -f /tmp/foo.txt ]; then
echo "File not found!"
fi
Файл Bash Испытания
-б имя_файла- специальный блочный файл
-с именем- специальный файл персонажа -д каталог название
- Проверка существования каталога
-э имя_файла- проверка существования файла, независимо от типа (узел, каталог, розетки и т. д.) -Ф имя_файла
- регистрация на регулярные существование файл не является каталогом
-Г имя_файла
- проверить, если файл существует и принадлежит эффективному идентификатору группы
-Г установить идентификатор группы имя файла
- true, если файл существует и является установить идентификатор группы
-к имя_файла- липкий бит -Л имя_файла
- символьная ссылка
-O имя_файла
- true, если файл существует и принадлежит эффективный идентификатор пользователя
-Р имя_файла- проверить, если файл представляет собой обычный -С именем
- проверить, если файл сокета
-с именем- проверьте, если файл имеет ненулевой размер
-у имя_файла- проверить, если идентификатор пользователя файл бит
-ш имя_файла- проверить, если файл доступен для записи
-х имя_файла` - проверить, если файл является исполняемым
Как использовать:
#!/bin/bash
file=./file
if [ -e "$file" ]; then
echo "File exists"
else
echo "File does not exist"
fi
В выражения может быть инвертирован с помощью оператор
#!/bin/bash
file=./file
if [ ! -e "$file" ]; then
echo "File does not exist"
else
echo "File exists"
fi
Вы можете отрицать выражение с помощью "!":
#!/bin/bash
FILE=$1
if [ ! -f "$FILE" ]
then
echo "File $FILE does not exist"
fi
Соответствующей страницей man является man test
или, эквивалентно, man [
-- или help test
или help [
для встроенной команды bash.
[[ -f $FILE ]] || printf '%s does not exist!\n' "$FILE"
Кроме того, возможно, что файл является неработающей символической ссылкой или нерегулярным файлом, например, сокетом, устройством или fifo. Например, чтобы добавить проверку на битые симлинки:
if [[ ! -f $FILE ]]; then
if [[ -L $FILE ]]; then
printf '%s is a broken symlink!\n' "$FILE"
else
printf '%s does not exist!\n' "$FILE"
fi
fi
Это's стоит отметить, что если вам нужно выполнить одну команду можно сократить
if [ ! -f "$file" ]; then
echo "$file"
fi
для
test -f "$file" || echo "$file"
или
[ -f "$file" ] || echo "$file"
Я предпочитаю делать следующие один-лайнер, в в POSIX оболочки совместимый формат:
$ [ -f "/$DIR/$FILE" ] || echo "$FILE NOT FOUND"
$ [ -f "/$DIR/$FILE" ] && echo "$FILE FOUND"
На пару команды, как я бы сделал в скрипте:
$ [ -f "/$DIR/$FILE" ] || { echo "$FILE NOT FOUND" ; exit 1 ;}
Как только я начал делать это, я редко использую полностью типизированный синтаксис больше!!
Для проверки существования файла, параметр может быть одним из следующих:
-e: Returns true if file exists (regular file, directory, or symlink)
-f: Returns true if file exists and is a regular file
-d: Returns true if file exists and is a directory
-h: Returns true if file exists and is a symlink
Все тесты ниже распространяются на обычные файлы, каталоги и симлинки:
-r: Returns true if file exists and is readable
-w: Returns true if file exists and is writable
-x: Returns true if file exists and is executable
-s: Returns true if file exists and has a size > 0
Пример скрипта:
#!/bin/bash
FILE=$1
if [ -f "$FILE" ]; then
echo "File $FILE exists"
else
echo "File $FILE does not exist"
fi
Вы можете сделать это:
[[ ! -f "$FILE" ]] && echo "File doesn't exist"
или
if [[ ! -f "$FILE" ]]; then
echo "File doesn't exist"
fi
Если вы хотите проверить файл и папку обоих, то используйте опцию -е
вместо -Ф
. -е
возвращает true для обычные файлы, каталоги, розетки, специальные символьные файлы, специальные файлы и т. д.
Вы должны быть осторожны о запуске "тест" на переменную без кавычек, потому что это может привести к непредсказуемым результатам.
$ [ -f ]
$ echo $?
0
$ [ -f "" ]
$ echo $?
1
Рекомендации, как правило, имеют проверенные переменной в двойные кавычки:
#!/bin/sh
FILE=$1
if [ ! -f "$FILE" ]
then
echo "File $FILE does not exist."
fi
Существуют три различных способа сделать это:
если ! [ -е " и файл$" и ]; затем Эхо "файл не существует и" интернет
Или:
! [ -е " в файл$то" ] &ампер;&ампер; Эхо "файл не существует"и
[
(это так большинство ответов перед надарили):если [ ! -е " в файл$" и ]; затем Эхо "файл не существует и" интернет
Или:
[ ! -е " в файл$то" ] &ампер;&ампер; Эхо "файл не существует"и
||
вместо &&
):Только:
я || Эхо &[ - е " в файл$то" ]; файл не существует"и
Это выглядит глупо (ИМО), Дон'т использовать его, если ваш код должен быть портативный для оболочки Bourne (например, /Бен/ш
Соляриса 10 или раньше), в которых нет газопровода оператором отрицания (!
):
если [ -е " и файл$" и ]; затем |
---|
еще |
Эхо "файл не существует и" |
интернет |
В
[ -f "$file" ]
в [
команды а стат()
(не lstat()
) системный вызов, по пути хранящиеся в $File
и возвращает true если системный вызов завершается успешно и тип файла, возвращаемое стат()
является "регулярныхи".
Так что, если [ -ф " по$файл" ]
возвращает true, вы можете сказать, файл существует и является обычным файлом или символической ссылкой, в конечном счете, решать в обычный файл (или, по крайней мере, это было во время стат()
).
Однако, если он возвращает false (или если [ ! -ф " в файл$то" ]
или ! [ -ф " в файл$то" ]
возвращает true), есть много разных возможностей:
стат системного вызова()
может не получиться.Короче, она должна быть:
if [ -f "$file" ]; then
printf '"%s" is a path to a regular file or symlink to regular file\n' "$file"
elif [ -e "$file" ]; then
printf '"%s" exists but is not a regular file\n' "$file"
elif [ -L "$file" ]; then
printf '"%s" exists, is a symlink but I cannot tell if it eventually resolves to an actual file, regular or not\n' "$file"
else
printf 'I cannot tell if "%s" exists, let alone whether it is a regular file or not\n' "$file"
fi
Чтобы знать наверняка, что файл не'т существуют, мы'd нужен стат()
системный вызов, чтобы вернуть код ошибки ENOENT
(ENOTDIR
расскажет нам один из компонентов пути, не Каталог, это еще один случай, когда мы можем сказать, файл не'т существуют по этому пути). К сожалению, [
команда не'т дайте нам знать, что. Это возвратит false, будет ли код ошибка ENOENT, EACCESS (отказано), ENAMETOOLONG или что-нибудь еще.
В [ -Е " в файл$то" ]
тест также может быть сделано с ЛС-ЛД -- " в файл$" и > /dev/нуль
. В этом случае, ЛС
скажу вам, почему стат()
не удалось, хотя информация может'т быть легко использован программно:
$ file=/var/spool/cron/crontabs/root
$ if [ ! -e "$file" ]; then echo does not exist; fi
does not exist
$ if ! ls -Ld -- "$file" > /dev/null; then echo stat failed; fi
ls: cannot access '/var/spool/cron/crontabs/root': Permission denied
stat failed
По крайней мере команды ls
говорит мне, что это's не потому, что файл не'т существуют, что это не удается. Это's, потому что он может'т сказать, является ли файл существует, или нет. В [
команды просто игнорировали проблему.
С ЗШ
оболочки, можно выполнить запрос код ошибки с особыми переменная $errno значение
после того [команда
, и расшифруйте, что количество с помощью специального массива $errno с
модуля ЗШ/система
:
zmodload zsh/system
ERRNO=0
if [ ! -f "$file" ]; then
err=$ERRNO
case $errnos[err] in
("") echo exists, not a regular file;;
(ENOENT|ENOTDIR)
if [ -L "$file" ]; then
echo broken link
else
echo does not exist
fi;;
(*) syserror -p "can't tell: " "$err"
esac
fi
(остерегайтесь поддержку $errno С
был сломан с некоторыми версиями ЗШ
, когда причине в последних версиях ССЗ
).
Чтобы отменить испытание, использование и"!&и". Это равносильно, что "не то" логические операторы в других языках. Попробуйте это:
if [ ! -f /tmp/foo.txt ];
then
echo "File not found!"
fi
Или написано немного по-другому:
if [ ! -f /tmp/foo.txt ]
then echo "File not found!"
fi
Или вы могли бы использовать:
if ! [ -f /tmp/foo.txt ]
then echo "File not found!"
fi
Или, пресинг все вместе:
if ! [ -f /tmp/foo.txt ]; then echo "File not found!"; fi
Которые могут быть записаны (через то "и" оператор &&) как:
[ ! -f /tmp/foo.txt ] && echo "File not found!"
Который выглядит короче такой:
[ -f /tmp/foo.txt ] || echo "File not found!"
Этот код также работает .
#!/bin/bash
FILE=$1
if [ -f $FILE ]; then
echo "File '$FILE' Exists"
else
echo "The File '$FILE' Does Not Exist"
fi
"Тест" Что может рассчитывать. Он работал для меня (на основе оболочки Bash: проверьте, что файл существует или нет):
test -e FILENAME && echo "File exists" || echo "File doesn't exist"
Если вы хотите использовать тест
вместо []
, то вы можете использовать!
, чтобы получить отрицание:
if ! test "$FILE"; then
echo "does not exist"
fi
Вы также можете сгруппировать несколько команд в один лайнер
[ -ф "с именем" и ] || ( test1 эхо и усилитель; & test2 на Эхо и усилитель; & Эхо-test3 )
или
[ -ф "с именем" и ] || { Эхо условие_1 && test2 на Эхо и усилитель; & Эхо-test3 ;}
Если filename не'выход т на выходе будет
тест1 условие_2 test3
Примечание: ( ... ) работает в подуровень, { ... ;} работает в той же оболочке. Фигурные скобочная нотация работает только в bash.