web-dev-qa-db-ja.com

'$はbashでどういう意味ですか?

ASCII文字の数を取得したいので、次のようにします:

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

この文脈で_'$_はどういう意味ですか?誰かが構文を理解するためにドキュメントを私に指摘できますか? $(...)printfbashの部分かわかりません。

20
9uzman7

_'_は、printf引数の一部です(引数のセクション ここ を参照)。

_$_は通常のシェル展開の一部であるため、printf引数は_%d_および_'a_になります。

最後に、$(...)構文は Command Substitution です。この場合、NUMの値はprintf関数の出力に設定されます。

21
codelahoma

'$は特別な意味を持ちません。 %dprintfでは、引数を整数式として評価しようとします。 'achara、または整数97であると見なされます。変数展開を使用しなくても、同じ結果が得られます。

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

printfに関するbashのドキュメント (私の強調):

文字列以外のフォーマット指定子への引数は、先頭のプラス記号またはマイナス記号が許可されていることを除いて、C言語の定数として扱われ、先頭の文字が一重引用符または二重引用符の場合、値はASCII次の文字の値。

コメントに記載されているように、残っている文字はすべて無視されます。

28
muru

すでに述べたように、_'$_はそれ自体が特別なことを意味するものではありません。 _"'$VAR"_が_'a_に展開され、printfユーティリティの引数として渡されます。

次に、興味深い部分、つまり、printf(C言語の関数ではなく、シェルユーティリティ)のあいまいな、しかし標準的な機能が登場します。

SuSv4によると 標準 (鉱山を強調):

[printfへの]引数のオペランドは、対応する変換指定子がbc、またはsの場合は文字列として扱われ、対応する変換指定子がaAの場合はstrtod()関数によって評価されるeEfFg、またはG

それ以外の場合[e.g。変換指定子がd]の場合、ISO C標準で説明されているように、接尾辞のないC整数定数として評価され、次の拡張子が付けられます。

  • 先頭の_<plus-sign>_または_<hyphen-minus>_は許可されます。

  • 先行文字が一重引用符または二重引用符の場合、値は数値基になるコードセット内一重引用符または二重引用符に続く文字

  • 接尾辞付きの整数定数を使用できます。

シェルがマルチバイト文字をサポートしている場合(UTF-8と同様に、最新のシステムのデフォルト)、その数値は、先頭バイトではなく、完全な文字の数値になります。

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

これは文字の「ASCII値」ではないことに注意してください。bashのマンページの description は、せいぜい誤解を招くだけです。

ただし、bash(およびyashを除く他のほとんどのシェル)は、fgなどの浮動小数点数指定子でも変換を実行するため、標準に準拠していません。これは、strtod()その場合に使用する必要があります:

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