ASCII文字の数を取得したいので、次のようにします:
_VAR="a"
NUM=$(printf "%d" "'$VAR")
echo $NUM
_
この文脈で_'$
_はどういう意味ですか?誰かが構文を理解するためにドキュメントを私に指摘できますか? $(...)
かprintf
かbash
の部分かわかりません。
_'
_は、printf引数の一部です(引数のセクション ここ を参照)。
_$
_は通常のシェル展開の一部であるため、printf
引数は_%d
_および_'a
_になります。
最後に、$(...)
構文は Command Substitution です。この場合、NUM
の値はprintf
関数の出力に設定されます。
'$
は特別な意味を持ちません。 %d
printf
では、引数を整数式として評価しようとします。 'a
はchar
a
、または整数97であると見なされます。変数展開を使用しなくても、同じ結果が得られます。
$ printf %d\\n "'a'"
97
$ printf %d\\n "'0'"
48
$ printf %d\\n "'"$'\1'
1
printf
に関するbashのドキュメント (私の強調):
文字列以外のフォーマット指定子への引数は、先頭のプラス記号またはマイナス記号が許可されていることを除いて、C言語の定数として扱われ、先頭の文字が一重引用符または二重引用符の場合、値はASCII次の文字の値。
コメントに記載されているように、残っている文字はすべて無視されます。
すでに述べたように、_'$
_はそれ自体が特別なことを意味するものではありません。 _"'$VAR"
_が_'a
_に展開され、printf
ユーティリティの引数として渡されます。
次に、興味深い部分、つまり、printf
(C言語の関数ではなく、シェルユーティリティ)のあいまいな、しかし標準的な機能が登場します。
SuSv4によると 標準 (鉱山を強調):
[
printf
への]引数のオペランドは、対応する変換指定子がb
、c
、またはs
の場合は文字列として扱われ、対応する変換指定子がa
、A
の場合はstrtod()
関数によって評価されるe
、E
、f
、F
、g
、または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を除く他のほとんどのシェル)は、f
やg
などの浮動小数点数指定子でも変換を実行するため、標準に準拠していません。これは、strtod()
その場合に使用する必要があります:
_% bash --posix -c 'printf "%f\n" \"Q'
81.000000
_