Они выглядят неправильно:
data="$@"
data="$(find ...)"
Если вы хотите, чтобы data
был массивом, вам нужно
data=("$@")
data=($(find ...))
Что вы можете сделать, это назначить позиционные параметры:
#!/bin/bash
if [ "$#" = 0 ]
then
# no arguments; default to all matching files
set -- $(find ...)
fi
for value in "$@"
do
# things
done
Это означает, что l oop не может запуститься, пока не завершится команда find
. Чтобы решить эту проблему, альтернативой может быть перевернуть его и сделать использование "$@"
более похожим на вывод find
, то есть направить его в канал, например:
#!/bin/bash
args_or_find() {
if [ "$#" -gt 0 ]
then
printf '%s\n' "$@"
else
find ...
fi
}
while read -r value
do
# things
done < <(args_or_find)
Естественное расширение улучшить устойчивость, используя \0
вместо \n
, так как разделитель оставлен в качестве упражнения.