BASH - Глобальное совпадение возвращается только после первого совпадения - PullRequest
0 голосов
/ 25 июня 2018

Кодирование своего рода скрипта rm, в который я хотел бы передать сопоставления с подстановочными знаками.У меня есть несколько файлов в рабочем каталоге, которые соответствуют шаблону, который я передаю скрипту, но я получаю только один из них из простого тестового примера:

sh remove r*

В скрипте remove я сократил его до echo $1.

Вот содержимое каталога: [~ / project] $ ls file2 file4 newTestFile remove_engine restore file3 fileName_1234 remove remove_w restore_engine

И вот что я получаю обратно.[~ / project] $ sh remove r * remove

Я понимаю, что BASH расширяет подстановочный знак даже перед выполнением сценария.Но почему я не получаю все файлы в каталоге, которые соответствуют f*?

1 Ответ

0 голосов
/ 26 июня 2018

Расширение пути, иначе говоря, расширяет одно слово оболочки на несколько.В вашем случае

./remove r*

полностью идентичен выполнению

./remove remove remove_engine restore remove remove_w restore_engine

Как вы обнаружили, $1 будет remove, потому что это первый аргумент.Остальные файлы являются отдельными позиционными параметрами, поэтому $2 будет remove_engine, а $3 будет restore.

Для обработки всех аргументов вы используете "$@", либо вцикл:

for file in "$@"
do
  printf 'One of the matches was: %s\n' "$file"
done

или просто непосредственно в командах, которые также принимают несколько параметров:

# Delete all matches
echo rm "$@"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...