~からhttps://unix.stackexchange.com/a/94200/674
位置引数がない場合($#は0)、「$@」は次に展開されます。何もない(いいえ空の文字列、しかしゼロ要素を含むリスト)
それでは、空の文字列は要素がゼロのリストとどのように異なる動作をしますか?
「0個の要素を含むリスト」とは、「0個の要素を含む配列」を意味しますか?私はbashに概念がないと思いますlist
。
「なし」が必ずしも「リスト」または配列ではないことを意味できますか?
答え1
はい、ほとんどのシェルにはリスト(変数用)の概念はありません。
これは定義されたコンテンツタイプ(文字列または数字とは別のもの)ではありません。
ただし、コマンドの引数はリストです。
これは非常に特別なデータ型で、リストとしてのみ表現されます"$*"
。"$@"
しかし、違いがあります。
$ set -- one two t33
$ printf '<%s> ' "$*" ; echo
<one two t33>
$ printf '<%s> ' "$@" ; echo
<one> <two> <t33>
$ for s; do printf '<%s>' "$s" ; done; echo
<one><two><t33>
説明の後、引用符は、要素がゼロのパラメータリストが要素のないリストと同じであることを意味します。
つまり、リストは消えます(印刷する要素はありません)。
$ set -- $ echo $# 0 $ printf '<%s>' "$@" ; echo <> $ for s in "$*"; do echo "<a>" ; done <a> $ for s in "$@"; do echo "<a>" ; done $
最終コードは、「空」(ヌル)文字列でもなく「何も」印刷しません。
あなたの質問について:
「なし」が必ずしも「リスト」または配列ではないことを意味できますか?
何もない」はい(空)「リスト」でなければなりません。しかし、「空の文字列」が存在します。
答え2
デフォルトでは、$#
いくつかのパラメータが提供されています。 0は数値でもあり、パラメータが指定されていないことを示します。$@
ただし、拡張が空なので評価できません。 (たとえば、パラメータがあるかどうかを確認)スクリプトで直接試して、どのように機能するかを確認してください。
指定された引数の数を確認したい場合(例:スクリプトで計算)必須パラメータ3つ提案 - あなたはします$#
。
実際にパラメータを使用して操作を実行する必要がある場合を使用します$@
。
次の例をご覧ください。TLDP内部変数