Почему кавычки необходимы для аргумента файлов при вызове этого сценария Bash?

Я совершенно новый для сценариев Bash. У меня есть «testcript», который я использовал в качестве основы для более продвинутого / полезного скрипта:

#!/bin/bash files=$1 for a in $files do echo "$a" done 

Когда я вызываю это без кавычек, он просто подбирает один файл в каталоге:

 testscript *.txt 

Но когда я называю это кавычками, он работает правильно и выделяет все текстовые файлы:

 testscript '*.txt' 

Что здесь происходит?

2 Solutions collect form web for “Почему кавычки необходимы для аргумента файлов при вызове этого сценария Bash?”

Когда вы вызываете программу

 testscript *.txt 

то ваша оболочка расширяет и выдает все значения. Таким образом, это может эффективно вызвать вашу программу как

 testscript file1.txt file2.txt file3.txt file4.txt 

Теперь ваша программа смотрит только на $1 и поэтому работает только с file1.txt .

При цитировании в командной строке вы передаете литеральную строку *.txt скрипту, и это то, что хранится в $1 . Затем ваш цикл for расширяет его.

Обычно вы должны использовать "$@" а не $1 в таких сценариях.

Это «gotcha» для людей, пришедших из сценариев CMD, где командная оболочка не делает глобусы (как известно) и всегда передает литеральную строку.

Без кавычек оболочка расширяет *.txt перед вызовом скрипта, поэтому $1 – это только первый файл, который расширяется. Все txt файлы являются аргументами вашего сценария в этот момент (если их не так много).

С кавычками, что строка передается без расширения в скрипт, который затем позволяет делать расширение, как вы надеетесь.

  • Запустить скрипт из графического интерфейса с выходом терминала
  • Bash: опрос на создание файла и завершение, если выходы
  • разрешение bash отклонено, но sh works
  • FOR цикл не циклический
  • Сценарий загрузки Debian autossh не работает должным образом
  • как отображать файл ввода / вывода на оболочке
  • Как запустить скрипты MYSQL из сценария оболочки с переменными bash?
  • Избегайте задержек с сетевых вызовов в сценариях входа в систему и выхода из системы
  • Перенаправить скрипт stderr и stdout в файл, но сохранить stdout в tty?
  • Почему этот эхо-вызов перезаписывает существующий текст?
  • Необходимо получить выход Awk в определенной последовательности
  • Аргументы сценария Bash не передаются функции?
  • Interesting Posts

    Как я могу создать каталог «черная дыра» / dev / null?

    как вставить содержимое файла в совпадение с помощью sed – только первое появление

    Fold преобразует все CR и CRLF в LF?

    Мониторинг всплеска событий с inotifywait

    Как настроить изменение языка только в текущем окне?

    Перемещение выделенной клип-карты в основную часть при поступлении нового контента

    В системе Linux посмотрите, как занята файловая система

    Как фиксировать статус выхода команды без конечного результата в конвейере?

    Команда Unix для переименования нескольких файлов

    Просмотр физического расположения файла / каталога на жестком диске

    wlan0 не показывается в Кали

    grep не совпадает с выходом nc

    Приведение интерфейса не добавляет шлюз по умолчанию в таблицу маршрутизации в Ubuntu

    Как получить сообщения ядра на последовательной консоли в системе systemd?

    Проблема не может установить локаль; убедитесь, что $ LC_ * и $ LANG верны!

    Linux и Unix - лучшая ОС в мире.