Bashユーザーからのはい/いいえ応答の処理


11

これは私の愚かさかもしれません。はい/いいえ、真/偽の応答をBashスクリプト内で受け入れたい:

test.sh

#!/bin/bash

ARGUMENT=$1

echo User passed in $ARGUMENT

OPTARG=${ARGUMENT:0:1}

if [[ "$OPTARG" -eq 0 ]] || [[ "${OPTARG^^}" == "N" ]]; then
    echo Decline
elif [[ "$OPTARG" -eq 1 ]] || [[ "${OPTARG^^}" == "Y" ]]; then
    echo Accept
else
    echo Invalid argument
fi

以下にいくつかのサンプル結果を示します。

./test.sh 0

User passed in 0
Decline

./test.sh 1

User passed in 1
Accept

./test.sh 2

User passed in 2
Invalid argument

./test.shいいえ

User passed in No
Decline

今、切り株。なぜ[[ "${OPTARG^^}" == "N" ]]文字列に対してtrueを返すのですか?

./test.shはい

User passed in Yes
Decline

./test.sh ThisShouldNotMatch

User passed in ThisShouldNotMatch
Decline

これを引用するとどうなりますか?OPTARG = "$ {ARGUMENT:0:1}"
mikeserv 2014年

1
気にしないで。Goldilocksは正しいです。
mikeserv 2014年

回答:


10

この:

if [[ "$OPTARG" -eq 0 ]] 

単なる数字でない限り、任意の文字列に一致します。使用する:

if [[ "$OPTARG" == "0" ]] 

代わりに。


8

あなたのコードの問題はgoldilocksによってよく説明されていますが、私はあなたのコードが不必要に長いと言って抵抗することはできません。あなたはそれを大幅に簡略化することができます。

以下は、目的のコードと同等です。

echo User passed in $1
if [[ "$1" == [nN0]* ]]; then      # First argument starts with either n, N, or 0
    echo Decline
elif [[ "$1" == [yY1]* ]]; then    # First argument starts with either y, Y, or 1
    echo Accept
else
    echo Invalid argument
fi

また、マニュアルの条件付き構成を参照することもできます


ありがとう、devnull。このトリックは今後のスクリプトで間違いなく使用します。私はあなたの答えを受け入れるべきかどうか悩みましたが、ゴルディロックスの答えの違いが他の人に役立つかもしれないと思います。
i_grok 2014年

@i_grokゴルディロックスの回答が問題を指摘していることを回答で述べました。私はもっ​​と読みやすく思える別のアプローチを提示しただけです。問題を解決するための複数のアプローチが登場するのを見るのは良いことです。どの回答が受け入れられるかについては、比較的些細なことです。
devnull 2014年

6

また使用できます case

read -p 'Do you want to Continue (yes/no?): ' 
case $REPLY in
       [yY]|[yY][eE][sS]) echo Accept             ;;
           [nN]|[nN][oO]) echo Decline            ;;
                       *) echo "Invalid argument" ;;
esac
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.