Неясно, для чего используются символы и цифры канала в вашей переменной $FILES
.Однако вот что вам может пригодиться:
#!/bin/bash
filespecs='*stores*.dat *hr*.dat *emp*.txt'
dir='/release/ext'
cd "$dir"
for file in $filespecs
do
sh myexternalscript.sh "$dir/$file"
done
Обратите внимание, что ваш вопрос помечен как "bash", и вы используете "bash" в своем шебанге, но по какой-то причине вы используете "sh", когда выназови свой другой сценарий.В некоторых системах sh
является символической ссылкой на Bash, но при непосредственном вызове она будет вести себя иначе, чем Bash.Во многих системах sh
полностью отделен от Bash.
Чтобы расширить глобусы и включить другие аргументы, вам нужно будет нарушить правило Bash всегда заключать в кавычки переменные (это пример одного изисключения).
filespecs='*stores*.dat | 3
*hr*.dat 4 5
*emp*.txt 6 7 8'
while read -r spec arg1 arg2 arg3 arg4
do
sh myexternalscript.sh "$dir"/$spec "$arg1" "$arg2" "$arg3" "$arg4"
done < <(echo "$filespecs")
Используйте столько аргументов "arg", сколько вам нужно.Дополнения будут переданы как пустые, но установить аргументы.Если аргументов для их принятия больше, чем переменных, тогда последняя переменная будет содержать все остатки в дополнение к той, которая ей соответствует.Эта версия не нуждается в cd
, так как глобус не раскрывается, пока не будет добавлен каталог, в то время как в первой версии глобус расширяется до того, как каталог будет добавлен.
Если вы заключите в кавычки каналытаким образом, как показано в вашем вопросе, двойные кавычки будут включены в аргумент.В способе, который я показываю, передается только символ канала, но он защищен, поскольку переменная заключена в кавычки в момент обращения к ней.