2015-12-14 7 views
4

Я хочу сделать две вещи в этом сценарии: 1) передать имя файла сценария опции 2) перейти к сценариюBash скрипт - как прочитать файл построчно, используя getopts

пример 1 : $./test_script.sh file_name_to_be_read проходит только имена файлов в сценарий

пример 2: $./test_script.sh -a -b file_name_to_be_read имя файла передачи и опция для сценария

Я могу получить пример 1 для работы с использованием следующие коды:

while read -r line ; do 
    echo $line 
done 

В примере 2, я хочу, чтобы добавить дополнительные флаги, подобные этим:

while getopts "abc opt; do 
    case "$opt" in 
    a) a=1 
     echo "a is enabled" 
     ;; 
    b) b=1 
     echo "b is enabled" 
     ;; 
    esac 
done 

, но как я могу сделать это так, что имя_файла является обязательным и использоваться с или без опции?

+1

бокового примечание: строки, считываемые 'в то время чтения -r line' будет иметь все ведущие/конечные вкладки и пробела удалены. Чтобы действительно прочитать строки файла дословно, используйте 'while IFS = read -r line' –

ответ

3

getopts только анализирует параметры (аргументы, начинающиеся с -); другие аргументы остаются в силе. Параметр OPTIND сообщает вам индекс первого аргумента, который еще не просмотрел; обычно вы отбрасываете варианты до этого.

while getopts "ab" opt; do 
    case "$opt" in 
    a) a=1 
     echo "a is enabled" 
     ;; 
    b) b=1 
     echo "b is enabled" 
     ;; 
    esac 
done 

shift $((OPTIND - 1)) 

echo "$# arguments remaining" 
for arg in "[email protected]"; do 
    echo "$arg" 
done 

Предшествующий, если называется bash tmp.bash -a -b c d e, производит

$ bash tmp.bash -a -b c d e 
a is enabled 
b is enabled 
3 arguments remaining: 
c 
d 
e 
+0

Я нашел это объяснение сдвига ((OPTIND -1)): shift $ ((OPTIND-1)) (примечание OPTIND - это верхний регистр) обычно обнаруживается сразу после цикла getopts while. $ OPTIND - количество опций, найденных getopts. shift "$ ((OPTIND-1))" – user97662

+0

'OPTIND' остается' 1', если первый аргумент не начинается с '-' .e.g. 'bash tmp.bash foo -a -b -c' – anubhava

+0

В некотором смысле' getopts' находит «первый аргумент без опционов; это то, что заставляет 'getopts' иметь ненулевой статус выхода, завершая цикл. Получаемый 'shift 0' оставляет список аргументов немодифицированным. – chepner