なぜ${#}、${##}は1、${?}、${??}、${!}は0、${-}は569JNORXZghiklmsです。

なぜ${#}、${##}は1、${?}、${??}、${!}は0、${-}は569JNORXZghiklmsです。

次のものが見つかりました。ドキュメントをどこで見つけることができるかを知りたいです。

❯ echo ${#}
1

❯ echo ${##}
1

❯ echo ${?}
0

❯ echo ${??}
0

❯ echo ${!}
0

❯ echo ${-}
569JNORXZghiklms

❯ echo ${--}
569JNORXZghiklms

ベストアンサー1

少なくともBashマニュアルには2つの違いがあります。これは標準機能でなければならず、すべてのシェルで同様でなければなりません。たとえ${-}ここの実際の値がZshから来たように見えますが、

$ echo ${#}
1
$ echo ${?}
0
$ echo ${!}
0
$ echo ${-}
569JNORXZghiklms

これらは特殊パラメータ #?および、!-オプションの中括弧を使用して拡張されます。$#、、、$?または同じように使用してください$!$-「名前」には、英数字ではなく単一文字を持つ他の特殊パラメータがあります。通常${foo}は と同じです$fooが、同様の場合に として扱われますので中括弧が${foo}bar必要$foobarです${foobar}

特に、

  • $#スクリプトまたは現在の関数の位置引数または引数の数。努力するfun() { echo $#; }; fun a b c;

  • $?最後のフォアグラウンドコマンドまたはパイプ()の終了状態ls -l /doesnotexist; echo $?

  • $!最新のバックグラウンドジョブの場合は、プロセスID(sleep 2 & ps uax |grep $!)と

  • $-リストsetバナー効率的。 (Zshの一部のフラグ。Zshもそのような操作がないようにsetopt見え、Bashはこれを設定されていないとマークします。)$!0

$ echo ${##}
1
$ echo ${??}
0
$ echo ${--}
569JNORXZghiklms

特別なパラメータ#?および-がありますが、追加のパラメータもあります。パラメータ拡張ジョブが含まれます。 (何と呼ぶべきかわかりません。パラメータ拡張の一部にすぎません。)

  • ${#parameter}値の長さです範囲だから、いつ$#is 1(または0など)、${##}is 1、そしていつis foo=abc${#foo}isです3

    (多少関係があるので、${parameter#word}プレフィックスを削除すると範囲起動部分の一致言葉削除されました(たとえば、任意の1文字と一致するためfoo=abcdef; echo ${foo#??}提供されます)。特別な場合は、長さを取得するか、空のプレフィックスを削除すると解釈できますが、ここでは長さの拡張が優先されます。同じですが、末尾の部分を削除します。 )cdef?${##}${parameter%word}

  • ${parameter?word}値を提供する「設定されている場合は確認」拡張。範囲設定すると、そうでなければエラーが発生し、以下のテキストが表示されます。言葉$?常に設定されているので、確認することはあまり難しくありませんが、試してみてくださいunset foo; echo ${foo?unset value\!}

  • ${parameter-word}値は、次の「基本」拡張です。範囲別に設定すると言葉$-常に設定されているので、その値を取得できます。ただし、foo設定しないと${foo-bar}なりますbar

最後の2つとそれに似た他のものはコロン付きのバリエーションを持ち、${parameter:?word}以下${parameter:?word}でもトリガーされます。範囲空の文字列に設定します。 Bashのマニュアルはここでより明確にすることができます。テキストの違いについて言及しますが、コロンなしでフォームを一覧表示するわけではありません。これPOSIXテキストには素晴らしいテーブルがあります。、しかし。


#ここで、?とが異なる2つの意味を持つという事実は、-偶然の一致であるか、制限された特殊文字セットとシェルで使用されるやや簡潔な構文の結果です。

おすすめ記事