Опция -f
для rm
позволяет утилите не выдавать сообщения, если файловые операнды не существуют. Он также не выйдет с ошибкой.
Что возможно, происходит в вашем случае, так это то, что один или несколько каталогов пусты, за исключением файлов или каталогов со скрытыми именами, поэтому *
в конце вашего шаблона не расширяется до что-нибудь. Вы можете сделать так, чтобы глобус *
соответствовал скрытым именам в bash
, установив параметр оболочки dotglob
.
Вы также не должны помещать $
в имена переменных в присваиваниях, и вам необходимо заключать расширения переменных в двойные кавычки, чтобы избежать разделения слов и генерации имен файлов (подстановок ). Имена переменных должны быть в нижнем регистре, чтобы вы случайно не перепутали переменные среды или специальные переменные оболочки.
Альтернативная формулировка вашего кода, учитывающая эти вещи;
#!/bin/bash
shopt -s dotglob
images_dir="/Users/michael/scripts/imagefiles"
backup_dir="/Users/michael/scripts/imagebackups"
dirs=( "$images_dir" "$backup_dir" )
for dir in "${dirs[@]}"; do
rm -f "$dir"/*
done
Вышеприведенное попытается удалить все файлы из каталогов. Если каталоги имеют подкаталоги, вы получите сообщение об ошибке из rm
. Если вы хотите удалить их тоже, используйте -r
с rm
.
Нет, это невозможно. Если ваша среда bash
, вы должны следовать правилам bash. В bash некоторые символы имеют особое значение, и если вы хотите избежать этого, вам нужно экранировать их либо с помощью \
, либо с помощью кавычек.
Если вы хотите что-то более удобное для пользователя, возможно, вам следует выбрать другую среду. Использование read
внутри скрипта bash может быть достаточным. Однако когда начинаешь все усложнять, понимаешь, что использовать кавычки не так уж и сложно.