В моем текущем сценарии я использую 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
Вы, вероятно, хотите '' ;; завершающего свой 'б)' случай. И ваше определение 'b:' ожидает аргумент, но ваша строка командной строки примера не проходит. – bishop
Вы правы. Optoin b не должен иметь «:» за ним. Я исправил это, и теперь проблема ушла. – user97662