Почему кавычки необходимы для аргумента файлов при вызове этого сценария 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 файлы являются аргументами вашего сценария в этот момент (если их не так много).

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

  • Как проверить, нет ли строки в tcsh
  • Шебанг, начинающийся с `//`?
  • пакетный инструмент для отправки файлов через webdav
  • Cronjob не выполняет сценарий оболочки, но когда я выполняю его автономно, он работает. Зачем?
  • Почему программированию на C не нужны сценарии компилятора и оболочки?
  • Мощный способ выполнения команды / запуска скрипта при входе в систему?
  • Сравните несколько файлов с файлом ref и распечатайте, если это соответствует
  • Использование одной команды для определения скорости NIC
  • Использование скрипта Fifo
  • скрипт trash и restore - проблема восстановления
  • Самый простой способ переупорядочить столбцы и управлять текстовым файлом
  • Linux и Unix - лучшая ОС в мире.