Разбор аргументов / опций / флагов в скрипте bash - PullRequest
1 голос
/ 18 ноября 2011

Я пытаюсь разобрать параметр в bash-скрипте. Как я могу использовать getopts, чтобы увидеть, был ли введен необязательный флаг.

FILE1=$1
FILE2=$2
outputfile=''
while getopts "o" OPTION
do
    case $OPTION in
    o)
       outputfile=$OPTARG
    ;;
    esac
done
if [ ! $outputfile -eq '' ]
then
    cat $FILE1 | paste - | $FILE1 - | tr "\t" "\n" | paste $FILE1 $FILE2 | tr '\t' '\n' > $outputfile

else
    cat $FILE1 | paste - | $FILE1 - | tr "\t" "\n" 
    paste $FILE1 $FILE2 | tr '\t' '\n' 
fi

1 Ответ

6 голосов
/ 18 ноября 2011

Здесь есть ряд проблем. Сначала необходимо проанализировать параметры (цикл getopts), затем удалить их из списка аргументов (с shift $(($OPTIND-1))), , а затем получить FILE1 и FILE2 из $ 1 и $ 2. Во-вторых, вы должны указать getopts, что -o принимает аргумент (getopts "o:"). В-третьих, ваш цикл getopts должен включать проверку на недопустимую опцию (и вы, вероятно, также должны убедиться, что были указаны и FILE1, и FILE2). В-четвертых, при проверке, является ли $ outputfile пустым, вам нужно заключить его в двойные кавычки, а затем использовать строковый тест (-eq проверяет равенство чисел и выдает ошибку, если вы используете его для сравнения чего-либо, кроме чисел). В-пятых, вы должны иметь двойные кавычки вокруг имен файлов на случай, если в них есть забавные символы. Наконец, фактические команды, которые вы пытаетесь выполнить (вставка, tr и т. Д.), Не имеют смысла (поэтому я в значительной степени оставил их в покое). Вот мой снимок при переписывании:

#!/bin/sh
outputfile=''
while getopts "o:" OPTION
do
    case $OPTION in
    o)
        outputfile="$OPTARG"
    ;;
    [?])
        echo "Usage: $0 [-o outfile] file1 file2" >&2
        exit 1
    ;;
    esac
done
shift $(($OPTIND-1))

if [ $# -ne 2 ]; then
    echo "Usage: $0 [-o outfile] file1 file2" >&2
    exit 1
fi
FILE1="$1"
FILE2="$2"

if [ -n "$outputfile" ]; then
    cat "$FILE1" | paste - | "$FILE1" - | tr "\t" "\n" | paste "$FILE1" "$FILE2" | tr '\t' '\n' > "$outputfile"
else
    cat "$FILE1" | paste - | "$FILE1" - | tr "\t" "\n"
    paste "$FILE1" "$FILE2" | tr '\t' '\n'
fi
...