`echo $((0x63))`を理解する


18

コマンドラインで16進数に変換する方法を探していて、非常に簡単な方法があることがわかりましたecho $((0x63))

それはうまく機能していますが、ここで何が起こっているのか少し混乱しています。

$(...)は通常、内容が外部コマンドの前に評価されるサブシェルであることを知っています。

この状況ではまだサブシェルですか?私は、サブシェルが(0x63)コマンドではないものを評価しているだけではないことを考えています。

誰かが私のためにコマンドを分解できますか?

回答:


27

$(...)(サブシェルだけでなく)コマンド置換$((...))ですが、算術展開です。

を使用する$((...))と、...は算術式として解釈されます。これは、特に、16進数の文字列が数値として解釈され、10進数に変換されることを意味します。その後、式全体が、式が評価される数値に置き換えられます。

パラメータ展開やコマンド置換の$((...))ように、シェルの単語分割とファイル名のグロビングの影響を受けないように引用符で囲む必要があります。

echo "$(( 0x63 ))"

補足として、算術式で発生する変数は、それらを必要としません$

$ x=030; y=30; z=0x30
$ echo "$(( x + y +x ))"
78

2
また$((...))、コマンド置換と競合するためecho "$( (echo x; echo y) | tr xy yx)"echo "$((echo x; echo y) | tr xy yx)"(一部のシェルはまだ後者のYMMVを受け入れますが)コマンドの代わりに記述する必要があることに注意してください。
ステファンシャゼラス

@StéphaneChazelasそして$(( ))、単語の分割やグロビングの影響を受ける出力をどのように作成しますか?
ハウケレイジング

3
@HaukeLaging 、 IFS=9; echo $((0x63)). 参照してくださいbashで変数を引用し忘れによるセキュリティへの影響を/ POSIXシェルWhat about [ $# -gt 1 ]セクション)
ステファンChazelas

3

これはサブシェルではなく、算術評価です。からman bash

((式))

式は、算術評価で後述する規則に従って評価されます。式の値がゼロ以外の場合、戻りステータスは0です。それ以外の場合、戻りステータスは1です。これはlet "expression"とまったく同じです。


9
((...))とはまったく同じではありません$((...))。両方とも算術評価を行いますが、後者は文字列としての結果値に置き換えられます。
クサラナナンダ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.