На основании Google's Style Guide я сделал следующий скрипт. Сценарий должен принимать файлы типа a.txt
и b.txt
и изменять их на PREFIX_1_prefix_a.txt
и PREFIX_1_prefix_b.txt
. Тем не менее, когда я вхожу:getopts не записывает аргументы (скрипт переименования файлов)
$ sh rename_enum.sh -n 100 -P X -p Y
Я ожидаю X_100_Y_a.txt
и X_101_Y_b.txt
, но я получаю _1_a.txt
и _2_b.txt
. Может ли кто-нибудь сказать мне, что я делаю неправильно?
#!/bin/bash
#verbose='false'
nflag=1
Pflag=''
pflag='_'
files='*.txt'
while getopts 'nPpf' flag; do
case "${flag}" in
n) nflag="${OPTARG}" ;;
P) Pflag="${OPTARG}_" ;;
p) pflag="_${OPTARG}_" ;;
f) files="${OPTARG}" ;;
#v) verbose='true' ;;
*) error "Unexpected option ${flag}" ;;
esac
done
for i in ${files}
do
mv "$i" "${Pflag}${nflag}${pflag}$i"
nflag=$((nflag + 1))
done
Начать с '#!/Bin/bash', когда вы используете синтаксис bash. Используйте 'for i в $ {files}' и '$ {Pflag} $ {nflag} $ {pflag} $ i', когда следуете руководству по стилю Googles. Не используйте backtics для командной подстановки. –
'expr $ {OPTARG}' на самом деле ничего не делает. 'nflag = $ OPTARG' достаточно. – chepner
Ваша обработка 'файлов' является субоптимальной. Во-первых, это произойдет неудачно, если имя файла включает пробел или метасимвол оболочки. Во-вторых, вы почти наверняка хотите, чтобы интерфейс разрешал несколько файлов. Я бы рекомендовал удалить опцию '-f' (и файлы переменных) и заменить оператор' for' на 'for f in '$ {@: OPTIND}; do' – rici