Мне нужно создать сценарий оболочки, который проверяет наличие файла и, если он не существует, создает его и переходит к следующей команде или просто переходит к следующей команде. То, что у меня есть, не делает этого.
#!/bin/bash
# Check for the file that gets created when the script successfully finishes.
if [! -f /Scripts/file.txt]
then
: # Do nothing. Go to the next step?
else
mkdir /Scripts # file.txt will come at the end of the script
fi
# Next command (macOS preference setting)
defaults write ...
Возврат
line 5: [!: command not found
mkdir: /Scripts: File exists
Понятия не имею, что делать. Каждое место, которое приносит поиск Google, указывает на что-то другое.
bash
shell-script
osx
JRW
источник
источник
touch
файл и пропустить условное?[
и!
), но, вероятно, здесь полезно указать, что[
это настоящая команда в Unix. Команде Unix требуется некоторый пробел между именем команды и ее аргументами. Да, это тоже встроенная Bash , но в/usr/bin/[
большинстве систем есть бинарный файл .Ответы:
Возможно более простое решение, нет необходимости делать явные тесты, просто используйте:
Если вы не хотите «модификации» время существующего
file.txt
быть измененtouch
, вы можете использовать ,touch -a /Scripts/file.txt
чтобыtouch
изменить только «доступ» и «изменение» раз.источник
>>/Scripts/file.txt
. Это откроет файл для добавления и создаст его, если он не существует.Вы получаете сообщение об ошибке , потому что нет никакого пространства между
[
и!
тем не менее есть и некоторые недостатки в вашем коде. Сначала вы проверяете, не существует ли файл, а если нет, то ничего не делаете. Если файл существует, вы создаете каталог (но ничего не делаете для его создания).Вам также не нужна нулевая операция, вы должны просто выполнить:
Это проверка, если
/Scripts/file.txt
не существует, он создаст/Scripts
каталог, а затемfile.txt
файл. Вы также можете проверить существование каталога отдельно, если хотите. Кроме того, обратите внимание, что я использую-e
вместо того,-f
что вы попросили просто проверить наличие файла, который-e
будет делать, где-f
проверяет, что это "обычный файл" http://tldp.org/LDP/abs/html/fto. HTMLисточник
Начнем с того, что скрипт оболочки не является скриптом bash , поэтому давайте сделаем ваш код более общим:
Каждая система Posix должна иметь этот файл; Bash строго необязательно.
Не нужно проверять, существует ли каталог, просто
Чтобы создать файл, если он не существует,
Или, если вы предпочитаете,
источник
У вас есть синтаксическая ошибка. Вам нужны пробелы до и после
[
и]
.источник
Выше предполагается, что нет никаких «хитростей», таких как создание каталога с именем
/Scripts/file.txt
(что может быть способом заставить скрипт всегда входить в ветку if). Если «файл» является каталогом, проверка -f не будет выполнена и команда touch ничего не изменит.источник
мой подход
выход
,
источник
touch
иmkdir -p