Единственными случаями rm $oldfile могут быть ошибки, когда ваше имя файла содержит любой символ IFS (пробел, табуляция, новая строка) или любой символ глоба (*, ?, []). [!d0 ]
Если присутствует какой-либо символ из IFS, оболочка будет выполнять разбиение слов и на основе наличия расширений имени шаблонов глобусов при расширении переменной.
Так, например, если имя файла foo bar.old., переменная oldfile будет содержать foo bar.old..
Когда вы это делаете:
rm $oldfile
оболочка сначала разбивает разложение oldfile на пробел на два слова, foo и bar.old.. Таким образом, команда становится:
rm foo bar.old.
, что, очевидно, приведет к неожиданному результату. Кстати, если у вас есть какие-либо операторы globbing (*, ?, []) в расширении, то расширение пути также будет выполнено.
Вам нужно процитировать переменные, чтобы получить желаемый результат:
rm "$oldfile"
Теперь не будет разбито слово или расширение пути, поэтому вы должны получить желаемый результат, то есть желаемый файл будет удален. Если какое-либо имя файла начинается с -, тогда выполните:
rm -- "$oldfile"
Вы можете спросить, почему нам не нужно указывать переменные при использовании внутри [[ , причина в том, что [[ является ключевым словом bash и обрабатывает переменное расширение, внутренне сохраняющее литерал расширения.
Теперь пару точек:
[d12 ] Вы должны перенаправить STDERR (exec 2>errorfile) перед командой rm, иначе [[ -s errorfile ]] тест даст ложные срабатывания. Вы использовали [ -s $errorfile ], вы используете переменное расширение $errorfile, которое было бы присвоено NUL errorfile переменная не определена нигде. Возможно, вы имели в виду только [ -s errorfile ], на основе перенаправления STDERR. Если переменная errorfile определена при использовании [ -s $errorfile ], она снова захлестнет вышеупомянутые случаи IFS и заглохнет, поскольку в отличие от [[, [ f35] не обрабатывается внутри bash. В более поздней части скрипта вы пытаетесь cp уже удаленный файл (опять же без цитирования переменной), это не имеет никакого смысла, вы должны проверить, что патрон и внести необходимые исправления на основе вашей цели.