echo $((2#$ 1))は正確に何をしますか?


53

次のbashスクリプトは、2進数が与えられると10進数を表示します。

echo $((2#$1))

なぜ正確に?

それ$1がインプットだと理解しています。おそらく2ベース(バイナリ)です。しかし、使用されている構文を理解できません。

回答:


72

男バッシュ

   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
ゼロの説明の場合は-1。
マックスリード

27
これはかなりよく、私が思うに説明している
NanoPish

19
既存のドキュメントをキュレートすることで「のみ」であっても、質問に完全に答えることは-1に値しません。特にそのドキュメントがbashのマンページである場合。
YoungFrog

31
man bash | wc[GNU bash、バージョン3.2.57]のマニュアルページが4890行、37094ワード、329778文字であることを示します。この回答では、関連する7行、176ワード、1115文字のみを削除します。その答えはあなたの賛成に値すると思います。(このコメントのように
;

7
@MaxRied:不要な毛羽立ちを求めるコメントに対して-1
Mehrdad

30

次のドキュメントから:https : //tiswww.case.edu/php/chet/bash/bashref.html#Shell-Arithmetic

先頭が0の定数は、8進数として解釈されます。先行する「0x」または「0X」は16進数を示します。それ以外の場合、数値は[base#] nの形式を取ります。オプションの基数は、算術基数を表す2〜64の10進数で、nはその基数の数です。base#を省略すると、base 10が使用されます。nを指定する場合、9より大きい数字は、小文字、大文字、「@」、「_」の順に表されます。baseが36以下の場合、10〜35の数字を表すために小文字と大文字を同じ意味で使用できます。

だから、echo $((16#FF))出力255echo $((2#0110))出力6


25

Iporの答えは優れていますが、非常にわずかに不完全です。bashのマニュアルページの引用部分は、構文は定数に対してのみ機能し、定数ではないことを示しています。これが実際にどのように機能するかを尋ねるべきです![base#]n2#$1

拡張

    展開は、コマンドラインが単語に分割された後に実行されます。実行される展開には、ブレース展開、チルダ展開、パラメータおよび変数展開、コマンド置換、算術展開、ワード分割、パス名展開の7種類があります。

    拡張の順序は次のとおりです。チルダ展開、パラメーターおよび変数展開、算術展開、およびコマンド置換(左から右に行われます); 単語分割; およびパス名の展開。

基本的に、Bashは最初に変数置換を行っているため、$1最初にその値で置換されます。その後、算術展開を行い、適切な定数のみを確認します。


これは不要なようです。OPは、「それ$1が入力であることを理解しています」と言っています。
スコット

8
展開の順序を理解することは、多くの異なるBash式を理解するのに非常に役立つためです。
アンソニーG-モニカの正義

1
これは単にIporの答えに対するコメントであったかもしれません。
-chepner

1
@chepnerよくフォーマットされたblockquoteをコメントに絞り込んでみてください:
アレクサンダー

1
$1算術式が評価される前に整数定数を生成するためにパラメータが展開されることに注意してください。gnu.org/ software / bash / manual / bash.txt、セクション3.5を参照してください」
-chepner
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.