web-dev-qa-db-ja.com

Bashの宣言、タイプセット、ローカル変数の違い

Bashで変数を入力するとき、declaretypesetの違いは何ですか?関数内で使用する場合:declaretypesetlocalの違いは何ですか?

私が遭遇した唯一の違いは、タイプセットがkshスクリプトに移植可能であることです。それ以外に、一方が他方よりも優先される理由はありますか?

更新:質問にlocalを追加しました。

42
lecodesportif
  • typesetdeclareの違い:

前者の方が移植性が高い(kshなど)が、移植性が問題にならない場合は後者がより好ましい。

  • 関数内で使用した場合のdeclare(またはtypeset)とlocalの違い:

前者は後者を意味しますが、より強力です。たとえば、declare -i xxinteger属性を持たせ、declare -r xxを読み取り専用にするなどです。

27
Hui Zheng

Bashに関する限り、違いはありません。実際、マンページでは同じ定義を共有しています

[-aAfFilrtux] [-p] [name [= value] ...]を宣言します
typeset [-aAfFilrtux] [-p] [name [= value] ...]
変数を宣言するか、属性を指定します。名前が指定されていない場合は、変数の値を表示します。 -pオプションは、各名前の属性と値を表示します...

私はまた this little tidbit を見つけました。これは私の主張とあなたが述べたksh移植性をさらに裏付けています。

宣言またはタイプセットのビルトインは正確な同義語であり、変数のプロパティを変更できます。これは、特定のプログラミング言語で利用できるタイピング[1]の非常に弱い形式です。 declareコマンドは、バージョン2以降のBashに固有です。 typesetコマンドは、kshスクリプトでも機能します。

11
SiegeX

セクション のBashマニュアルでは、4.2 Bash組み込みコマンド に次のように記載されています。

「タイプセット」
typeset [-afFrxi] [-p] [NAME [= VALUE] ...]
Kornシェルとの互換性のために、「typeset」コマンドが提供されています。ただし、「declare」組み込みコマンドのために非推奨になりました。