コマンドラインで16進数に変換する方法を探していて、非常に簡単な方法があることがわかりましたecho $((0x63))。
それはうまく機能していますが、ここで何が起こっているのか少し混乱しています。
私$(...)は通常、内容が外部コマンドの前に評価されるサブシェルであることを知っています。
この状況ではまだサブシェルですか?私は、サブシェルが(0x63)コマンドではないものを評価しているだけではないことを考えています。
誰かが私のためにコマンドを分解できますか?
コマンドラインで16進数に変換する方法を探していて、非常に簡単な方法があることがわかりましたecho $((0x63))。
それはうまく機能していますが、ここで何が起こっているのか少し混乱しています。
私$(...)は通常、内容が外部コマンドの前に評価されるサブシェルであることを知っています。
この状況ではまだサブシェルですか?私は、サブシェルが(0x63)コマンドではないものを評価しているだけではないことを考えています。
誰かが私のためにコマンドを分解できますか?
回答:
$(...)(サブシェルだけでなく)コマンド置換$((...))ですが、算術展開です。
を使用する$((...))と、...は算術式として解釈されます。これは、特に、16進数の文字列が数値として解釈され、10進数に変換されることを意味します。その後、式全体が、式が評価される数値に置き換えられます。
パラメータ展開やコマンド置換の$((...))ように、シェルの単語分割とファイル名のグロビングの影響を受けないように引用符で囲む必要があります。
echo "$(( 0x63 ))"
補足として、算術式で発生する変数は、それらを必要としません$:
$ x=030; y=30; z=0x30
$ echo "$(( x + y +x ))"
78
$(( ))、単語の分割やグロビングの影響を受ける出力をどのように作成しますか?
IFS=9; echo $((0x63)). 参照してくださいbashで変数を引用し忘れによるセキュリティへの影響を/ POSIXシェル(What about [ $# -gt 1 ]セクション)
$((...))、コマンド置換と競合するためecho "$( (echo x; echo y) | tr xy yx)"、echo "$((echo x; echo y) | tr xy yx)"(一部のシェルはまだ後者のYMMVを受け入れますが)コマンドの代わりに記述する必要があることに注意してください。