パラメータが宣言されたかどうかをテストする正しい方法ですか?

パラメータが宣言されたかどうかをテストする正しい方法ですか?

これは例ですhttps://unix.stackexchange.com/a/56846/674

どのタイプの変数が宣言されているかをテストする別のbash関連の方法は、その変数が次にリストされていることを確認することです${!PREFIX*}

case " ${!foobar*} " in
  *" foobar "*) echo "foobar is declared";;
  *) echo "foobar is not declared";;
esac
  1. 私が正しい場合は、パラメータを宣言解除するために組み込みunset機能を使用してください。このunset事件は引用文で言うのと同じです。

    $ unset foobar
    $ case " ${!foobar*} " in
    >   *" foobar "*) echo "foobar is declared";;
    >   *) echo "foobar is not declared";;
    > esac
    foobar is not declared
    

    ただし、declareケースdは次のことを行いません。

    $ unset foobar
    $ declare foobar
    $ case " ${!foobar*} " in
    >   *" foobar "*) echo "foobar is declared";;
    >   *) echo "foobar is not declared";;
    > esac
    foobar is not declared
    

    パラメータが宣言されたかどうかをテストする正しい方法ですか?

  2. そして、" ${!foobar*} "パラメータ拡張の前後にスペースがあるのはなぜですか?配列や辞書の場合と変数ですが、配列や辞書ではない場合にもfoobar機能しますか?

ベストアンサー1

  1. 変数を値(nullかもしれません)として宣言する必要があるようです。

    unset foobar; declare foobar=
    

    Case 文は「foobar 宣言済み」を生成します。

  2. *" foobar "*特定の変数名を検出できるように引用符とスペースを使用します。リスト返された変数名の数${!foobar*}

    $ unset foobar; foobarbaz=1; foobarquz=2
    $ echo " ${!foobar*} "
     foobarbaz foobarquz 
    

    Case 文は「foobar が宣言されていません」を生成します。

おすすめ記事