Ответ 1
Вам не хватает необходимого промежутка между кронштейном и -e
:
#!/bin/bash
if [ -e x.txt ]
then
echo "ok"
else
echo "nok"
fi
Я бы хотел написать оболочку script, которая проверяет, существует ли определенный файл archived_sensor_data.json
, и если да, удаляет его. Следуя http://www.cyberciti.biz/tips/find-out-if-file-exists-with-conditional-expressions.html, я пробовал следующее:
[-e archived_sensor_data.json] && rm archived_sensor_data.json
Однако это вызывает ошибку
[-e: command not found
когда я пытаюсь запустить полученный test_controller
script с помощью команды ./test_controller
. Что не так с кодом?
Вам не хватает необходимого промежутка между кронштейном и -e
:
#!/bin/bash
if [ -e x.txt ]
then
echo "ok"
else
echo "nok"
fi
Вот альтернативный метод с использованием ls
:
(ls x.txt && echo yes) || echo no
Если вы хотите скрыть любой вывод из ls
, поэтому вы видите только да или нет, перенаправляйте stdout
и stderr
на /dev/null
:
(ls x.txt >> /dev/null 2>&1 && echo yes) || echo no
В любом случае, команда rm должна проверять существование файла,
так зачем добавлять еще один тест? Просто выдайте
rm filename
и после этого он исчезнет, был ли он там или нет.
Используйте rm -f, если вы не хотите получать сообщения о несуществующих файлах.
Если вам нужно предпринять какое-либо действие, если файл НЕ существует, то вы должны проверить это самостоятельно. Исходя из вашего примера кода, в данном случае это не так.
Фоном для моей рекомендации по решению является история друга, который, на второй неделе его первая работа, вытерла половину build-сервера в чистоте. Таким образом, основная задача состоит в том, чтобы выяснить, существует ли файл, и если да, то пусть его удалит. Но на этой реке есть несколько коварных порогов:
Все это файл.
Скрипты имеют реальную силу, только если они решают общие задачи
В общем, мы используем переменные
Мы часто используем силу -f в сценариях, чтобы избежать ручного вмешательства
А также люблю рекурсивный -r, чтобы быть уверенным, что мы создаем, копируем и уничтожаем своевременно.
Рассмотрим следующий сценарий:
У нас есть файл, который мы хотим удалить: filesexists.json
Это имя файла хранится в переменной
<host>:~/Documents/thisfolderexists filevariable="filesexists.json"
У нас также есть переменная пути, чтобы сделать вещи действительно гибкими
<host>:~/Documents/thisfolderexists pathtofile=".."
<host>:~/Documents/thisfolderexists ls $pathtofile
filesexists.json history20170728 SE-Data-API.pem thisfolderexists
Итак, давайте посмотрим, сделает ли -e
то, что должен. Файлы существуют?
<host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?
0
Это так. Магия.
Однако, что произойдет, если переменная файла будет случайно оценена как nuffin '
<host>:~/Documents/thisfolderexists filevariable=""
<host>:~/Documents/thisfolderexists [ -e $pathtofile/$filevariable ]; echo $?
0
Что? Он должен вернуться с ошибкой... И это начало истории, как это все папка была случайно удалена
Альтернативой может быть проверка специально для того, что мы понимаем как "файл"
<host>:~/Documents/thisfolderexists filevariable="filesexists.json"
<host>:~/Documents/thisfolderexists test -f $pathtofile/$filevariable; echo $?
0
Итак, файл существует...
<host>:~/Documents/thisfolderexists filevariable=""
<host>:~/Documents/thisfolderexists test -f $pathtofile/$filevariable; echo $?
1
Так что это не файл и, возможно, мы не хотим удалять весь этот каталог
man test
может сказать следующее:
-b FILE
FILE exists and is block special
-c FILE
FILE exists and is character special
-d FILE
FILE exists and is a directory
-e FILE
FILE exists
-f FILE
FILE exists and is a regular file
...
-h FILE
FILE exists and is a symbolic link (same as -L)
Если вы используете NFS, "тест" - лучшее решение, потому что вы можете добавить к нему тайм-аут, если ваш NFS не работает:
time timeout 3 test -f
/nfs/my_nfs_is_currently_down
real 0m3.004s <<== timeout is taken into account
user 0m0.001s
sys 0m0.004s
echo $?
124 <= 124 means the timeout has been reached
Конструкция "[-e my_file]" будет зависать до тех пор, пока NFS снова не будет функционировать:
if [ -e /nfs/my_nfs_is_currently_down ]; then echo "ok" else echo "ko" ; fi
<no answer from the system, my session is "frozen">