2015-08-08 8 views
0

На основании 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 
+1

Начать с '#!/Bin/bash', когда вы используете синтаксис bash. Используйте 'for i в $ {files}' и '$ {Pflag} $ {nflag} $ {pflag} $ i', когда следуете руководству по стилю Googles. Не используйте backtics для командной подстановки. –

+1

'expr $ {OPTARG}' на самом деле ничего не делает. 'nflag = $ OPTARG' достаточно. – chepner

+1

Ваша обработка 'файлов' является субоптимальной. Во-первых, это произойдет неудачно, если имя файла включает пробел или метасимвол оболочки. Во-вторых, вы почти наверняка хотите, чтобы интерфейс разрешал несколько файлов. Я бы рекомендовал удалить опцию '-f' (и файлы переменных) и заменить оператор' for' на 'for f in '$ {@: OPTIND}; do' – rici

ответ

1

Я нашел this man page, который объясняет, что если флаг имеет аргумент, то должно следовать двоеточие. Все, что я должен был сделать изменения линии ...

while getopts 'nPpf' flag; do 

... до ...

while getopts 'n:P:p:f:' flag; do 

... и я получил желаемый результат. Спасибо за комментарии, хотя!