`Echo $ ((0x63)) '' anlama


18

Komut satırı üzerinden onaltılık dönüştürmek için bir yol arıyordum ve çok kolay bir yöntem olduğunu gördüm echo $((0x63)).

Harika çalışıyor ama burada neler olduğu konusunda biraz kafam karıştı.

$(...)Normalde içeriğin dış komuttan önce değerlendirildiği bir alt kabuk olduğunu biliyorum .

Bu durumda hala bir alt kabuk mu? Ben bu alt kabuk sadece (0x63)bir komut değil değerlendirme anlamına gelir gibi değil düşünüyorum .

Birisi benim için emri bozabilir mi?

Yanıtlar:


27

$(...)bir komut ikamesidir (sadece bir alt kabuk değil), ama $((...))aritmetik bir genişlemedir.

Kullandığınızda $((...)), ...aritmetik bir ifade olarak yorumlanır. Bu, diğer şeylerin yanı sıra, onaltılık bir dizenin sayı olarak yorumlanacağı ve ondalık sayıya dönüştürüleceği anlamına gelir. Tüm ifade daha sonra ifadenin değerlendirdiği sayısal değerle değiştirilir.

Parametre genişletme ve komut ikamesi $((...))gibi, kabuğun kelime bölünmesinden ve dosya adı globbinginden etkilenmeyecek şekilde belirtilmelidir.

echo "$(( 0x63 ))"

Bir yan not olarak, aritmetik bir ifadede meydana gelen değişkenlerin şunlara ihtiyacı yoktur $:

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

2
Ayrıca çünkü unutmayın $((...))komut ikamesi ile çatışmalar, birine sahiptir yazmayı hatırlamak echo "$( (echo x; echo y) | tr xy yx)"yerine echo "$((echo x; echo y) | tr xy yx)"(bazı kabukları hala ikincisi, YMMV kabul edecek olsa bile).
Stéphane Chazelas

@ StéphaneChazelas Peki $(( ))kelime bölme veya zonklamadan etkilenen üretim çıktısını nasıl yapıyorsunuz ?
Hauke ​​Laging

3
@MaukeLaging IFS=9; echo $((0x63)),. Ayrıca bkz . Bash / POSIX mermilerinde bir değişken teklif etmeyi unutmanın güvenlik sonuçları ( What about [ $# -gt 1 ]bölüm)
Stéphane Chazelas

3

Bu bir alt kabuk değil, aritmetik bir değerlendirme. Gönderen man bash:

((İfade))

İfade, ARİTMETİK DEĞERLENDİRME altında aşağıda açıklanan kurallara göre değerlendirilir . İfadenin değeri sıfır değilse, dönüş durumu 0'dır; aksi halde geri dönüş durumu 1'dir. Bu, "ifade" için tam olarak eşdeğerdir.


9
((...))ile tam olarak aynı değildir $((...)). Her ikisi de aritmetik değerlendirme yapar, ancak ikincisi, bir dize olarak ortaya çıkan değerle değiştirilir.
Kusalananda
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.