入力した数量が制限内であることを確認する方法

入力した数量が制限内であることを確認する方法

ユーザーが3つ未満または3つ以上入力した場合は、ユーザー定義のエラーメッセージを表示できるように3つの入力を読んで計算したいと思います。私が書きたいプログラムのコードは次のとおりです。

echo "Enter three names"
read name1 name2 name3

入力が正確に3つの名前になるようにこれらの入力を検証したいと思います。それ以下でもそれ以上でもありません。

ベストアンサー1

一度に3つの名前を読むと、実際に3つの名前があるかどうかを簡単に確認することはできません。特に、名前にスペースが含まれる傾向があるためです。検出できます少ない3つの名前の代わりに変数が空であることをテストすると、問題は半分しか解決されません。

代わりに、それぞれの名前を個別に読んでください。

echo 'Enter three names:' >&2
read -r -p 'Name 1: ' name1
read -r -p 'Name 2: ' name2
read -r -p 'Name 3: ' name3

これにより、ユーザーがあまりにも多くの名前を入力するのを防ぐことができます(各read呼び出しは1つの名前を読み取り、そのうち3つのみを読み取るため)。

if [ -z "$name1" ] ||
   [ -z "$name2" ] ||
   [ -z "$name3" ]
then
    echo 'One or more names were empty!' >&2
    exit 1
fi

または、あまりにも少ない名前が入力されたかどうかを検出するのと似ています。

または配列の名前が必要な場合:

echo 'Enter three names:' >&2
for (( i=1; i<=3; ++i )); do
    read -r -p "Enter name $i: " name[i]
done

${name[i]}その後、読んで直接確認するか、後で別々のループで確認できます。

私は次のことをすることもできます

echo 'Enter three names:' >&2
for (( i=1; i<=3; ++i )); do
    if ! read -r -p "Enter name $i: " name[i] || [ -z "${name[i]}" ]
    then
        echo 'Invalid input, exiting' >&2
        exit 1
    fi
done

ファイルの終わり(ユーザーが押すCtrl+D)または空の項目をエラーとして処理して終了します。

または、

echo 'Enter three names:' >&2
for (( i=1; i<=3; ++i )); do
    while true; do
        if ! read -r -p "Enter name $i: " name[i]; then
            echo 'Ok, bye' >&2
            exit 1
        elif [ -n "${name[i]}" ]; then
            # string is non-empty (good!), skip to next name
            break
        fi
        echo 'Empty input, try again' >&2
    done
done

これにより、ユーザーはキーを押してスクリプトを終了でき、Ctrl+D入力した文字列が空の場合はユーザーに名前を再入力するように求められます。この入力ループを使用すると、次のこともできます。ユーザー入力検証nullではないことを要求することに加えて、他の方法があります。

おすすめ記事