Для нескольких входных файлов, использующих подстановочный знак, такой как * .txt, я обнаружил, что это работает отлично, экранирование не требуется. Он должен работать так же, как и собственное приложение bash, например, «ls» или «rm». Это нигде не было задокументировано, поэтому, потратив большую часть трех дней, пытаясь понять это, я решил опубликовать его для будущих читателей.
Каталог содержит следующие файлы (вывод ls)
file1.txt file2.txt file3.txt
Запустить скрипт как
$ ./script.sh *.txt
Или даже как
$ ./script.sh file{1..3}.txt
Сценарий
#!/bin/bash
# store default IFS, we need to temporarily change this
sfi=$IFS
#set IFS to $'\n\' - new line
IFS=$'\n'
if [[ -z $@ ]]
then
echo "Error: Missing required argument"
echo
exit 1
fi
# Put the file glob into an array
file=("$@")
# Now loop through them
for (( i=0 ; i < ${#file[*]} ; i++ ));
do
if [ -w ${file[$i]} ]; then
echo ${file[$i]} " writable"
else
echo ${file[$i]} " NOT writable"
fi
done
# Reset IFS to its default value
IFS=$sfi
Выход
file1.txt writable
file2.txt writable
file3.txt writable
Ключ временно переключал IFS (Внутренний разделитель полей). Вы должны быть уверены, что сохранили это перед переключением, а затем переключите его обратно, когда закончите, как показано выше.
Теперь у вас есть список расширенных файлов ( с пропущенными пробелами ) в массиве file [], который вы затем можете просмотреть. Мне нравится это решение лучше всего, проще всего программировать и проще для пользователей.