文字のASCIIコードを取得したいので、以下があります。
VAR="a"
NUM=$(printf "%d" "'$VAR")
echo $NUM
'$
この場合、どういう意味ですか?構文を理解するために誰かが私に文書を教えてもらえますか?$(...)
またはのprintf
一部かどうか理解していませんbash
。
答え1
'$
特別なことはありません。%d
inを使用すると、printf
引数を整数式として評価しようとします。 、または整数97'a
として扱われます。char
a
変数拡張なしで同じ結果が得られます。
$ printf %d\\n "'a'"
97
$ printf %d\\n "'0'"
48
$ printf %d\\n "'"$'\1'
1
~からバッシュ文書printf
(強調):
文字列以外の書式指定子の引数は C 言語定数として扱われますが、前にプラス記号またはマイナス記号を使用できます。先頭の文字が一重引用符または二重引用符の場合、値は次の文字のASCII値です。
コメントで述べたように、残りの文字は無視されます。
答え2
答え3
すでに述べたように、それ'$
自体には特別な意味はありません。あなたのコンテンツは、ユーティリティにパラメータとして渡されるように拡張"'$VAR"
されます。'a
printf
今、興味深い部分が出てきます。つまり、printf
普通だが標準的な機能(Cの関数ではなくシェルユーティリティ)です。
SuSv4によると基準(強調):
引数オペランド[to
printf
]は、対応する変換指定子が、、、または後の文字列として処理され、対応する変換指定子が、、、、、の場合は関数として評価されます。b
c
s
strtod()
a
A
e
E
f
F
g
G
そうでなければ[たとえば、変換指定子が次のような場合
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