2016-07-12 2 views
1

В моем текущем сценарии я использую getopts передать настройки опций, а затем прочитать строку файлов по линииBASH, getopts передать аргументы, а также читать строку за строкой

#! /bin/bash 

GetA=0 
GetB=0 

while getopts "ab:c:" opt; do 
    case "$opt" in 
    a) 
     GetA=1 
     echo "-a get option a" 
     ;; 
    b) 
     GetB=1 
     echo "-b get option b" 
     ;; 
    c) 
     c=${OPTARG} 
     ;; 
    esac 
done 

shift "$((OPTIND -l))" 


while IFS='' read -r line || [[ -n "$line" ]]; do 
    echo $line 
    echo "GetA is " $GetA 
    echo "GetB is " $GetB 
    echo "c is " $c 
done 

Теперь, если запустить этот сценарий с следующие командные строки:

testscript.sh -ab -c 10 somefile.txt 

Ожидаемый результат:

$ line1 from somefile.txt 
    GetA is 1 
    GetB is 1 
    c is 10 

Однако дается ошибка:

/testscript.sh: line number: No such file or directory 




EDIT 7/13/2016: Там не является дополнительным ':' после того, как б, после его удаления, сценарий больше не дает ошибку.

while getopts "ab:c:" opt; do 

Исправлено:

while getopts "abc:" opt; do 
+1

Вы, вероятно, хотите '' ;; завершающего свой 'б)' случай. И ваше определение 'b:' ожидает аргумент, но ваша строка командной строки примера не проходит. – bishop

+0

Вы правы. Optoin b не должен иметь «:» за ним. Я исправил это, и теперь проблема ушла. – user97662

ответ

2

read считывает данные из стандартного ввода, а не в командной строке аргумента. Либо явно указать файл для чтения из:

while IFS= read -r line; do # Assume the file ends with a newline 
    ... 
done < "$1" 

или покормить файл в скрипт с перенаправлением ввода:

testscript.sh -ab -c 10 < somefile.txt 

 Смежные вопросы

  • Нет связанных вопросов^_^