Intereting Posts
Как перезапустить поток отфильтрованного видео с помощью VLC? Неблокирующий буферный именованный канал? Используйте eth interface для подключения к маршрутизатору и wlan для Интернета Ограничение переадресации IP между определенными интерфейсами / сетями Expect Script: максимальное количество аргументов командной строки Исполняемый скрипт не может запускаться непосредственно с рабочего стола в Arch Linux Пользовательские скрипты kvm для автоматизации прикрепления устройства pci Как добавить скрипт bash в переменную PATH с помощью символических ссылок? Разрешения ACL / MAC для dovecot и postfix в CentOS 7 DNS-запросы со случайными именами DNS: вредоносное ПО? Как я могу перечислить свои задания «at» по дате? Просмотр большого изображения на Linux Инструменты для вывода записей из произвольных наборов файлов журналов между двумя датами Обнаружить, если stdin отправляется в оболочку Пользовательский драйвер для клавиатуры GNU / Linux 4.1.0-rc8 (Fedora)

Пустая строка это файл? (если )

Сценарий называется isFile.sh и выглядит так:

 #! / Bin / ш

 Эхо $ 1
 эхо $ 2

 если [ !  -f $ 1];  затем
   echo "$ 1 (arg1) - это не файл"
 фи

 если [ !  -f $ 2];  затем
   echo "$ 2 (arg2) - это не файл"
 фи

Сначала я создал файл, сделав touch file.exist .

И я запустил bash isFile.sh file.exist file.notexist Результат был:

file.exist

file.notexist

file.notexist (arg2) не является файлом


Затем я запустил bash isFile.sh "" file.notexist . Вывод был:

(# пустая строка)

file.notexist

file.notexist (arg2) не является файлом

Ожидаемый результат:

(# пустая строка)

file.notexist

(arg1) это не файл

file.notexist (arg2) не является файлом

Может кто-нибудь объяснить, почему?

Проблема в том, что [ ! -f $1 ] [ ! -f $1 ] становится [ ! -f ] [ ! -f ] после раскрытия (а не [ ! -f "" ] как вы думали!), поэтому вместо этого, если проверяется, существует ли данный файл, [ проверяется, является ли строка -f пустой или нет. Это не пусто, но спасибо ! окончательный код выхода равен 1 , поэтому команда echo не выполняется.

Вот почему вам нужно заключить свои переменные в оболочки POSIX.

Смежные вопросы:

  • Почему мой сценарий оболочки заглушает пробелы или другие специальные символы?
  • Последствия для безопасности: забыть заключить переменную в оболочку bash / POSIX