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