Echo $ ((2 # $ 1)) tam olarak ne yapar?


53

Aşağıdaki bash betiği, ikili sayı verildiğinde ondalık sayı görüntüler.

echo $((2#$1))

Tam olarak neden?

Bunun $1girdi olduğunu biliyorum . Belki 2üssü (ikili). Ancak kullanılan sözdizimini anlayamıyorum.

Yanıtlar:


72

erkek bash

   echo [-neE] [arg ...]
          Output  the  args,  separated  by spaces, followed by a newline.
          The return status is 0 unless a write error occurs.   If  -n  is
          specified, the trailing newline is suppressed.  If the -e option
          is given,  interpretation  of  the  following  backslash-escaped
          characters  is  enabled.

[...]

   Arithmetic Expansion
       Arithmetic  expansion allows the evaluation of an arithmetic expression
       and the substitution of the result.  The format for  arithmetic  expan‐
       sion is:

              $((expression))

[...]

   Constants with a leading 0 are interpreted as octal numbers.  A leading
   0x or  0X  denotes  hexadecimal.   Otherwise,  numbers  take  the  form
   [base#]n,  where the optional base is a decimal number between 2 and 64
   representing the arithmetic base, and n is a number in that  base.   If
   base#  is omitted, then base 10 is used.  When specifying n, the digits
   greater than 9 are represented by the lowercase letters, the  uppercase
   letters, @, and _, in that order.  If base is less than or equal to 36,
   lowercase and uppercase letters may be used interchangeably  to  repre‐
   sent numbers between 10 and 35.

66
SIFIR açıklama için -1.
Max Ried,

27
Oldukça iyi açıklandığını düşünüyorum bence
NanoPish

19
Tamamen bir soruyu cevaplamak, "sadece" mevcut dokümantasyona dokunarak bile olsa, benim için -1'i hak etmiyor. Özellikle de, bu belgeler bash'ın sayfasıysa.
YoungFrog

31
man bash | wc[GNU bash, sürüm 3.2.57] man sayfasının 4890 satır, 37094 kelime , 329778 karakter olduğunu gösterir. Bu cevap sadece ilgili 7 satır, 176 kelime , 1115 karakterden oluşur. Bence bu cevap senin lehine hak ediyor. (bu yorumu yaptığı gibi ;-)
Bruno Bronosky

7
@MaxRied: Gereksiz kabartmak istediğin için yorumuna -1
Mehrdad

30

Dokümandan: https://tiswww.case.edu/php/chet/bash/bashref.html#Shell-Arithmetic

Önde 0 olan sabitler sekizli sayılar olarak yorumlanır. Baştaki '0x' veya '0X' onaltılıyı gösterir. Aksi takdirde, sayılar [base #] n şeklini alır, burada isteğe bağlı taban, aritmetik tabanı temsil eden 2 ila 64 arasında bir ondalık sayıdır ve n, bu tabandaki bir sayıdır. Taban no atlanırsa, taban 10 kullanılır. N belirtilirken, 9'dan büyük rakamlar, küçük harflerle, büyük harflerle, '@' ve '_' ile bu sırada temsil edilir. Eğer baz 36'dan küçük veya ona eşitse, 10 ila 35 arasındaki sayıları temsil etmek için küçük ve büyük harfler birbirlerinin yerine kullanılabilir.

Böylece echo $((16#FF))çıktılar 255ve echo $((2#0110))çıktılar6


25

Ipor'un cevabı mükemmel ama çok az eksik. Bash man sayfasının alıntı kısmı sözdiziminin sadece sabitler için çalıştığını ve sabit olmadığını belirtir . Bunun gerçekten nasıl çalıştığını sormalısın![base#]n2#$1

GENİŞLEME

    Genişletme, komut satırında sözcüklere ayrıldıktan sonra gerçekleştirilir. Yapılan yedi çeşit genişleme vardır: küme genişletme, tilde genişletme, parametre ve değişken genişletme, komut değiştirme, aritmetik genişletme, sözcük bölme ve yol adı genişletme.

    Açılımların sırası şudur: ayraç büyümesi; tilde genişleme, parametre ve değişken genişleme, aritmetik genişleme ve komut değiştirme (soldan sağa doğru yapılır); kelime bölme; ve yol adı genişletme.

Temel olarak Bash önce değişken ikamesi yapıyor, böylece $1ilk değeri ile değiştiriliyor. Ancak o zaman sadece uygun bir sabit gören aritmetik genişleme yapar.


Bu gereksiz görünüyor; OP, "Bunun $1girdi olduğunu biliyorum" diyor .
Scott

8
+1, çünkü genişleme sırasını anlamak, birçok farklı Bash ifadesini anlamak için çok faydalıdır.
Anthony G - Monica

1
Bu sadece Ipor'un cevabına bir yorum olabilirdi.
chepner

1
@chepner Lütfen iyi biçimlendirilmiş blok alıntıları bir yorumda sıkmaya çalışın :-)
Alexander

1
"Parametresi Not $1aritmetik ifade değerlendirilmeden önce bir tamsayı sabit üretilmesi için genleştirilir bakınız. Gnu.org/software/bash/manual/bash.txt , bölüm 3.5"
chepner
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.