シェルスクリプトの変数値セットの定義

シェルスクリプトの変数値セットの定義

単一変数の値セットを定義したいと思います。例えば

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 01010notを参照)を使用します8[[ $1 -eq $s ]]または、((s == $1))任意のコマンド注入の脆弱性を導入するため、使用しないでください。


割り当てたい場合模様特定の入力と一致させたい変数の場合は、スカラー変数を使用し、サポートされている次のextglob2つ(オプションを含む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は、連想配列を使用することです。

そしてbashksh93

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空の文字列は許容値にすることはできません。)

おすすめ記事