Почему этот bash-скрипт не работает?

Почему этот bash-скрипт не работает?

Когда я запускаю следующую команду

./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

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