Bash: перебор файлов аргументов

Это может быть простой ответ, но после того, как я погуглил, я мог просто опустить терминологию, поэтому мне еще предстоит найти что-либо о том, о чем я спрашиваю.

Принимая аргумент, такой как /bin/*.txt, как вы перебираете каждый из файлов?

Я пробовал это:

for file in $2; do
    echo $file
done

Второй аргумент ($ 2) имеет вход, такой как /bin/*.txt, но эхо выводит только 1 текстовый файл из 6, которые у меня есть. Я неправильно повторяю это?

Я также пробовал использовать ls как таковой, и он тоже не будет правильно распечатывать ...

ls $2

person user1470511    schedule 23.07.2012    source источник


Ответы (1)


Если аргумент не заключен в кавычки, аргумент /bin/*.txt будет раскрыт прежде, чем ваш скрипт когда-либо его увидит. Таким образом, если аргумент по-прежнему /bin/*.txt, вы можете быть уверены, что нет файлов, соответствующих этому глобу. В противном случае у вас будет несколько аргументов, соответствующих всем совпадающим файлам, и вы можете просто использовать аргументы:

for file; do # equivalent to for file in "$@"
    echo "$file"
done

Если вы хотите, чтобы аргумент был процитирован, вам придется расширить его самостоятельно. Массив - достойный способ сделать это:

arg='/bin/*.txt'
files=( $arg )
for file in "${files[@]}"…
person kojiro    schedule 23.07.2012
comment
Итак, если бы я хотел выполнить конкретный вызов функции, а вторым переданным аргументом был список, как бы вы предложили перебирать файлы? Итератор аргументов, начиная со второго? - person user1470511; 24.07.2012
comment
Хорошо, я просто использовал сдвиг в вашем коде, и, похоже, он работал нормально. Я ценю помощь! - person user1470511; 24.07.2012
comment
@ user1470511 Предполагая, что вы имеете в виду, что аргументы со второго по последний являются списком файлов, вы можете использовать shift после присвоения имени первому аргументу: first_arg="$1"; shift;. После этого "$@" будет состоять из вашего списка аргументов. - person kojiro; 24.07.2012