Получить полностью выполненную команду из сценария оболочки

Опция -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.

0
28.11.2020, 20:20
1 ответ

Нет, это невозможно. Если ваша среда bash, вы должны следовать правилам bash. В bash некоторые символы имеют особое значение, и если вы хотите избежать этого, вам нужно экранировать их либо с помощью \, либо с помощью кавычек.

Если вы хотите что-то более удобное для пользователя, возможно, вам следует выбрать другую среду. Использование readвнутри скрипта bash может быть достаточным. Однако когда начинаешь все усложнять, понимаешь, что использовать кавычки не так уж и сложно.

0
18.03.2021, 22:46

Теги

Похожие вопросы