bashでは、「$」とはどういう意味ですか?

bashでは、「$」とはどういう意味ですか?

文字のASCIIコードを取得したいので、以下があります。

VAR="a"
NUM=$(printf "%d" "'$VAR")
echo $NUM

'$この場合、どういう意味ですか?構文を理解するために誰かが私に文書を教えてもらえますか?$(...)またはのprintf一部かどうか理解していませんbash

答え1

'$特別なことはありません。%dinを使用すると、printf引数を整数式として評価しようとします。 、または整数97'aとして扱われます。char a変数拡張なしで同じ結果が得られます。

$ printf %d\\n "'a'"
97
$ printf %d\\n "'0'"
48
$ printf %d\\n "'"$'\1'
1

~からバッシュ文書printf(強調):

文字列以外の書式指定子の引数は C 言語定数として扱われますが、前にプラス記号またはマイナス記号を使用できます。先頭の文字が一重引用符または二重引用符の場合、値は次の文字のASCII値です。

コメントで述べたように、残りの文字は無視されます。

答え2

これは'printfパラメータの一部です(パラメータセクションを参照)。ここ)。

$通常のシェル拡張の一部なので、引数は と に  printfなり%dます'a

最後に、$(...)次のようにビルドします。コマンドの置き換え、この場合、NUMその値を関数の出力に設定することを意味しますprintf

答え3

すでに述べたように、それ'$自体には特別な意味はありません。あなたのコンテンツは、ユーティリティにパラメータとして渡されるように拡張"'$VAR"されます。'aprintf

今、興味深い部分が出てきます。つまり、printf普通だが標準的な機能(Cの関数ではなくシェルユーティリティ)です。

SuSv4によると基準(強調):

引数オペランド[to printf]は、対応する変換指定子が、、、または後の文字列として処理され、対応する変換指定子が、、、、、の場合は関数として評価されます。bcsstrtod()aAeEfFgG

そうでなければ[たとえば、変換指定子が次のような場合d]、ISO C規格で説明されているように、次の拡張子を使用して接尾辞のないC整数定数として評価されます。

  • リード<plus-sign>または許可されます。<hyphen-minus>

  • 主人公一重引用符または二重引用符、値は数値でなければなりません。基本コードセットから次の文字一重引用符または二重引用符

  • 接尾辞付きの整数定数が許可されます。

シェルがマルチバイト文字をサポートしている場合(現代のシステムのデフォルト値UTF-8など)、数値は先行バイトではなく文字全体の値になります。

% printf '%d\n' '"á' "'é"
225
233
% printf 'U+%X\n' '"猫儿'
U+732B

これは文字の「ASCII値」ではありません。説明するbashのマンページはせいぜい誤解を招くからです。

fただし、bash(およびyashを除く他のほとんどのシェル)は、orなどの浮動小数点指定子を使用してもその変換を実行するため、互換性はありません。これは上記の最初の段落に明らかに違反するものであり、この場合に使用する必要があるとg言います。strtod()

% bash --posix -c 'printf "%f\n" \"Q'
81.000000

関連情報