Ответ 1
Родительская оболочка, вызывающая bash show_files.sh *
, расширяет *
для вас.
В вашем script вам необходимо использовать:
for dir in "[email protected]"
do
echo "$dir"
done
Двойные кавычки гарантируют правильную обработку нескольких пробелов и т.д. в именах файлов.
См. также Как перебрать аргументы в оболочке script.bash
Потенциально запутанное дополнение
Если вы действительно уверены, что хотите, чтобы script расширил *
, вы должны убедиться, что *
передано script (заключено в кавычки, как в других ответах), а затем убедитесь, что он расширен в правой части обработки (что не является тривиальным). В этот момент я бы использовал массив.
names=( [email protected] )
for file in "${names[@]}"
do
echo "$file"
done
Я не часто использую [email protected]
без двойных кавычек, но это один раз, когда это более или менее правильная вещь. Трудная часть состоит в том, что он не будет обрабатывать карты с пробелами в очень хорошем состоянии.
Рассмотрим:
$ > "double space.c"
$ > "double space.h"
$ echo double\ \ space.?
double space.c double space.h
$
Это прекрасно работает. Но попробуйте передать это как wild-card для script и... ну, пусть просто скажу, что в этот момент становится сложно.
Если вы хотите извлечь $2
отдельно, вы можете использовать:
names=( $1 )
for file in "${names[@]}"
do
echo "$file"
done
# ... use $2 ...