Как использовать подстановочные знаки для нескольких событий в скрипте оболочки?

Как использовать подстановочные знаки для нескольких событий в скрипте оболочки?

Я хочу ввести все входные данные, соответствующие шаблону, используя подстановочные знаки. Пример:

$ 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для получения дополнительной информации об обработке аргументов в скрипте.

Связанный контент