
Когда я запускаю следующую команду
./command *
используя этот скрипт
#!/bin/bash
for f in ./$1
do
echo $f
done
отображается только первый файл, указанный в $1. У меня вопрос: почему?
решение1
Потому что вы не использовали простые или двойные кавычки при выполнении команды:
./command '*'
или:
./command "*"
Или, если вы хотите обязательно использовать ./command *
, то внесите следующие изменения в свой скрипт:
#!/bin/bash
for f in ./"$@"
do
echo $f
done
Это потому, что $1
относится к первому аргументу вашей команды, а $@
относится ко всем аргументам вашей команды.
Прочитайте также некоторые документы по этому поводу:http://tldp.org/LDP/abs/html/internalvariables.html#APPREF
решение2
Оболочка расширяет *
при запуске команды. Таким образом, запуск скрипта эквивалентен
./command file1.txt file2.txt file3.txt
$1
соответствует первому аргументу, поэтому цикл имеет только одну итерацию.
решение3
$1
относится только к первому аргументу. Вам нужно использовать $*
.
#!/bin/bash
for f in $*
do
echo $f
done