Если я правильно угадываю, что вы хотите, попробуйте
#!/bin/bash
case $1:$2 in
upper:lower | lower:upper ) ;;
*) echo "Syntax: $0 upper|lower lower|upper files ..." >&2; exit 1;;
esac
from=$1
to=$2
shift; shift
for file; do
mv "$file" "$(echo "$file" | tr "[:$from:]" "[:$to:]")"
done
. Это имеет явное преимущество в том, что допускает более трех аргументов, где первые два указывают операцию, которую нужно выполнить.
Обратите внимание также на то, как мы стараемся всегда заключать в кавычки строки, содержащие имя файлаСм. Также Когда обернуть кавычки вокруг переменной оболочки?
Фактически вышеупомянутый скрипт также должен работать с /bin/sh
;мы не используем никаких функций Bash-only, поэтому он должен работать под любым POSIX sh
.
Однако гораздо более удачным вариантом будет использование опции, позволяющей решить, какое отображение применить, и просто принять(возможно, пустой) список параметров и список аргументов имени файла.Тогда вы также можете использовать встроенный в Bash параметр расширения .Однако операции расширения параметров преобразования регистра доступны только в Bash 4.
#!/bin/bash
op=',,'
# XXX FIXME: do proper option parsing
case $1 in -u) op='^^'; shift;; esac
for file; do
eval mv "\$file" "\${file$op}"
done
По умолчанию он преобразуется в нижний регистр и переключается в верхний регистр, если вы передаете -u
перед именами файлов.
В обоих этих сценариях мы используем for file
в качестве сокращения для for file in "$@"
, то есть перебираем (оставшиеся) аргументы командной строки.Возможно, это та деталь, которую вы искали.