Похоже
testFILE=`echo FILE | tr '[A-Z]' '[a-z]'`
должен быть
testFILE=`echo "$FILE" | tr '[A-Z]' '[a-z]'`
Переписывание сценарий, чтобы исправить некоторые другие мелкие вещи
#!/bin/bash
testFILE=
FLAG=1
for FILE in *; do
testFILE=$(tr '[A-Z]' '[a-z]' <<< "$FILE")
for FILE2 in *; do
if [ "$testFILE" = "$FILE2" ]; then
FLAG=0
fi
done
if [ $FLAG -eq 1 ]; then
mv -- "$FILE" "$(tr '[A-Z]' '[a-z]' <<< "$FILE")"
fi
FLAG=1
done
- Quote переменных для предотвращения софистики (
"$FILE"
вместо $FILE
)
- Обычно предпочтительнее использовать
$()
вместо тильды
- Не используйте сравнение строк, где вы не должны
- Используйте
--
разграничить аргументы в команды, которые его принимают (чтобы предотвратить обработку файлов, таких как -file
)
- По соглашению вы должны использовать только имена переменных капитала для переменных среды, хотя я сохранил их выше.
- Трубы против здесь струны (
<<<
) здесь не имеет значения, но <<<
немного быстрее и вообще безопаснее.
Хотя более просто, я думаю, что вы хотите
#!/bin/bash
for file in *; do
testFile=$(tr '[A-Z]' '[a-z]' <<< "$file")
[ -e "$testFile" ] || mv -- "$file" "$testFile"
done
Или на большинстве современных mv
реализаций (технически не Posix)
#!/bin/bash
for file in *; do
mv -n -- "$file" "$(tr '[A-Z]' '[a-z]' <<< "$file")"
done
С man
страницы
-n, --no-clobber
do not overwrite an existing file
Вы можете использовать 'mv -i' для запроса перед перезаписью и/или использовать' if [[-e "$ testFILE"]]; затем ... ', чтобы проверить, существует ли файл уже. –