У меня есть сценарий на моем Mac, в котором я пытаюсь зациклить текстовые файлы внутри подпапки моего текущего местоположения. Это myscript.sh
:
cd /Users/Desktop/
for entry in $(pwd)/txt/*.txt
do
echo $entry
done
выводит строку пути, включая * txt
, например / Users / Desktop / txt / *. Txt
Я хочу зациклить файлы .txt, поэтому ожидаю, что echo $ entry
напечатает имена файлов txt, но вместо этого напечатает / Users / Desktop / txt / *. Txt
Если вы зададите оболочке шаблон подстановки, который не соответствует ни одному имени файла, шаблон подстановки не будет расширен. В вашем случае это означает, что echo
в цикле выводит сам шаблон.
Альтернативная реализация вашего скрипта:
cd /Users/Desktop || exit 1
for entry in txt/*.txt; do
test -e "$entry" && echo "$entry"
done
Эта реализация завершится с ненулевым кодом выхода, если cd
не работает. Тогда он не будет использовать pwd
, поскольку в этом нет необходимости. Он получит список имен, соответствующих шаблону, и будет перебирать их. На каждой итерации он проверяет, действительно ли в файловой системе есть что-то с таким именем, прежде чем выводить это имя на стандартный вывод.
Если вы хотите, чтобы echo
внутри lop выводил полный путь к файлам, используйте echo "/Users/Desktop/$entry"
или еще лучше:
dir="/Users/Desktop"
cd "$dir" || exit 1
for entry in txt/*.txt; do
test -e "$entry" && printf '%s/%s\n' "$dir" "$entry"
done