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

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

  • перенаправление и вывод журнала
  • Восстановление tty с помощью stty
  • Инициализировать скрипт для запуска скрипта как конкретного пользователя
  • Сценарий Bash для отображения списка каталогов дает ошибку
  • Что означает $ {1: 0: 2} в этом контексте?
  • два файла .csv сравниваются с помощью awk
  • Прокручивать строки из двух файлов параллельно
  • Скрипт для проверки использования файловой системы и свободного пространства
  • Как я могу вырваться из цикла while изнутри вложенного оператора case?
  • Почему программированию на C не нужны сценарии компилятора и оболочки?
  • обнаружить, если PDF-файл сделан из изображений
  • Interesting Posts

    Плавающий MAC-адрес в формате Heartbeat

    Как настроить gpg2 для передачи PIN-кода смарт-карты, если не используется программа pinentry?

    Как получить среднюю скорость потока труб

    Почему CTRL + L в терминале не будет очищать экран, как cls в Powershell

    busybox tar или разделить большой файл на несколько файлов меньшего размера

    SSH: предоставить дополнительные «труба» fds в дополнение к stdin, stdout, stderr

    член группы не может записать файл с возможностью записи в группу с помощью reiserfs и расширенных списков ACL

    samtools / sed для редактирования файла bam

    Как сохранить атрибуты файла Windows при копировании файлов в Linux?

    Изменение размеров каталогов

    Получение «Жесткий диск может быть неудачным» при запуске

    Как интерпретировать информацию traceroute?

    Как процесс может иметь другое имя в выпуске ps?

    Как получить новые форматы файловой системы для использования в mkfs?

    регулярное выражение grep grep в команде sed

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