Я хочу ввести все входные данные, соответствующие шаблону, используя подстановочные знаки. Пример:
$ cat file_lister.sh
echo $1
$ ls *.txt
file1.txt
file2.txt
file3.txt
$ ./file_lister.sh ./*.txt
file1.txt
Но я ожидал, что мой сценарий будет напечатан
file1.txt
file2.txt
file3.txt
решение1
При запуске скрипта:
$ ./file_lister.sh ./*.txt
Оболочка расширяется ./*.txt
до ./file1.txt ./file2.txt ./file3.txt
, поэтому после расширения вы фактически выполняете:
$ ./file_lister.sh ./file1.txt ./file2.txt ./file3.txt
Ваш скрипт выводит первый аргумент:
echo $1
$1
соответствует первому аргументу, переданному скрипту, который в данном случае ./file1.txt
— я ожидал увидеть это вместо просто file1.txt
(если только вы на самом деле не запустили ./file_lister.sh *.txt
).
Как уже предлагали другие в комментариях, если вы хотите распечататьвсеаргументов вместо первого, есть ряд вещей, которые вы можете сделать. Самый простой — изменить $1
(первый аргумент) на $@
(все аргументы).
#!/bin/bash
printf '%s\n' "$@"
Видетьэтот вопрос на Stack Overflowдля получения дополнительной информации об обработке аргументов в скрипте.