ユーザーが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ではないことを要求することに加えて、他の方法があります。