単一変数の値セットを定義したいと思います。例えば
singleDigit={0,1,2,3,4,5,6,7,8,9}
ユーザーが 10 を入力すると、エラーで終了します。
ループを使わずに配列を使用してこれをどのように達成できますか?
答え1
複数の値を 1 つの変数に保存するには、次を使用できます。大量に良い:
allowed_values=(0 1 2 3 4 5 6 7 8 9)
または
allowed_values=({0..9})
with bash3+
(今から借りた構文はzsh
でも使用できますksh93
)。
与えられた文字列がこれらの値の中にあるかどうかを確認するには、次の関数を定義できます。
isin() {
local s
for s in "${@:2}"; do
[[ $1 = "$s" ]] && return 0
done
return 1
}
if isin "$input" "${allowed_values[@]}"
(ではzsh
これを行うことができますif ((allowed_values[(eI)$input]))
)。
比較は語彙です(例:01!= 1)。数値比較を実行するには[ "$1" -eq "$s" ] 2> /dev/null
(yes 010
、10
notを参照)を使用します8
。[[ $1 -eq $s ]]
または、((s == $1))
任意のコマンド注入の脆弱性を導入するため、使用しないでください。
割り当てたい場合模様特定の入力と一致させたい変数の場合は、スカラー変数を使用し、サポートされている次のextglob
2つ(オプションを含む3つ)のパターン構文のいずれかを使用できますbash
。
ワイルドカード/グローバルパターン
pattern='[0-9]'
次のように使用されます。
case $input in ($pattern) echo OK;; (*) echo NOK esac
または
if [[ $input = $pattern ]]; then echo OK else echo NOK fi
拡張正規表現:
regex='^[0-9]$'
次のように使用されます。
if [[ $input =~ $regex ]]; then echo OK else echo NOK fi
通常、単一文字以外の値の場合は、次のものを使用できます。
regex='^(one|two|three)$'
そしてモデル、次のextglob
オプションが必要です。
shopt -s extglob
pattern='@(one|two|three)'
bash4+
、またはまたはを使用するksh93
別の方法zsh
は、連想配列を使用することです。
そしてbash
、ksh93
:
typeset -A allowed_values
allowed_values=([one]=1 [two]=1 [three]=1)
if ((allowed_values[$input])); then
echo OK
else
echo NOK
fi
でもzsh
同じですが、割り当て構文は次のとおりです。
typeset -A allowed_values
allowed_values=(one 1 two 1 three 1)
(使用時にbash
空の文字列は許容値にすることはできません。)
答え2
0から9までの数字のみが許可されている場合は、単純なIFステートメントを使用してください。
#!/bin/bash
echo -n Please enter a single digit:
read single_digit
if [ $single_digit -lt 10 ]; then
echo Thanks for $single_digit
else
echo Screwball!!! I said SINGLE DIGIT!!
fi