1. 概要

組み込みのletコマンドは、BashおよびKornシェルの基本ソフトウェアの一部です。 その主な用途は、基本的な算術演算を使用して変数の割り当てを作成することに焦点を当てています。

この記事では、コマンドの一般的な使用構文について説明します。 次に、通常の変数代入の場合とは異なるすべての意味のあるプロパティを示します。 次に、同様の変数割り当てと数学演算を実行する代替コマンドとの比較を進めます。 調査したすべての主題とともに、コマンドをしっかりと理解するために、適切な例を通じてコマンドの魅力的な特性を強調します。

2. 構文と特徴

let コマンドは、基本的な数学的評価と組み合わせて変数の割り当てを実行します。 その典型的な構文は、最も単純な形式では非常に単純です。

let statement1 [statement2 [...] ]

ここで、 statement1 [statement2 […]]、は、数値への変数の割り当て、または数学演算による数値評価を表します。

ステートメントに含まれる変数は、コマンドのローカルスコープを取得し、それらの属性値は固定幅の10進整数のみになります。 変数に文字列を割り当てようとすると、失敗します。

最後に、このコマンドの卓越した柔軟性と有効性を概説する魅力的なプロパティの重要なリストがあります。 一般的な変数代入演算との比較は、その可能性を理解するのに役立ちます。 次のセクションでは、いくつかの包括的な例を通じて基本的なプロパティを調べます。

2.1. 複数のステートメントと変数の拡張

1つのコマンドで、複数のステートメントをセミコロン句読点を必要とせずに簡単に連結できます’;’。 通常、標準の代入式に存在することで、結果として生じるコマンドが1行にとどまるのを区別します。 次の例で、この事実を簡単にテストできます。

$ let age=25 weight=57

さらに、パラメータ展開に関する拡張機能は、変数の展開も、おなじみのプレフィックス記号’$’を使用せずに名前だけで参照できることです。 次の場合にこれがどのように適用されるかを見てみましょう。

$ let length=5 width=7 area=length*width
$ echo "length: $length - width: $width - area: $area"
length: 5 - width: 7 - area: 35

最後に、プレフィックス「$」の削除は制限されたルールではありません。 これは、接頭辞付き変数が単独で存在することも、前者のタイプと混合して存在することもできることを意味します。 このような場合、変数の拡張プレフィックスの存在は競合することなく機能します。

$ let "x=3" "y=4" "z2=x**2+$y**2"; echo $x, $y, $z2
3, 4, 25

2.2. 二重引用符を使用した割り当ての変数と操作

let コマンドの追加の興味深い機能は、割り当て定義が二重引用符で囲まれている場合に表示されます。

通常の変数割り当てインスタンスでは、スペースは存在できません。 代入演算子’=’と二項演算子の両方について、演算子とオペランドが構文的に付加された構造を維持することが必須です。 一般的な変数宣言の場合、スペアスペースの間にあるスペースは割り当てを壊します。

$ year= 1981
bash: 1981: command not found...
$ volume =125
bash: volume: command not found...

let コマンドは、式を二重引用符で囲んで成功します。 この場合:

$ let "year= 1981" "volume =5**3" 
$ echo "year: $year - volume: $volume" 
year: 1981 - volume: 125

別の解決策として、複数の式を単一の二重引用符で囲まれたエンティティにマージし、後続のステートメントをコンマ’、’で区切ることができます。 後者の例は、この処方箋の下で次のように表示されます。

$ let "year= 1981 , volume =5**3"

2.3. スコープの可視性

letコマンドの適切な環境の特徴であるかを見てみましょう。 コマンドは、その中で動作する変数のローカルスコープを構築します。変数の他のローカル文字と同様に、この環境に事前定義された変数が存在すると、上書きされます。

$ version=10 let "version=11, release = version"; echo "$version, $release"
11, 11

さらに、変数がローカルスコープに設定されている場合、興味深いプロパティが出現しますが、それらの有効な値はまだ考慮されていません。 このような場合、変数を評価するときに値は更新されません。 次の例で、このケースの詳細を見てみましょう。

$ let "count=11, max=count++"; echo $count,$max
12,11

上記では、max割り当ての時点でのcount変数の増分はまだ保留中です。 したがって、適切な値はそのまま残ります。 max に割り当てる前に、 count 更新の評価を要求することにより、更新は現在のシェルに適用されます。 最後に、これはmax変数にも当てはまります。

$ let "count=11, max=++count"; echo $count,$max
12,12

2.4. letコマンドで終了ステータス

let コマンドの終了時の終了ステータスは、右端の変数に割り当てられた値によって決定されます。

前のステートメントに割り当てられた値とは関係なく、最後の式は、返される終了ステータスを定義する式です。 より明確に言えば、最後のステートメントで、変数の値が0に対応する場合、返される終了ステータスは1(FALSE)です。 それ以外の場合、正または負の値が割り当てられていると、返される終了ステータスは0(TRUE)です。

以下に、それぞれの場合に終了ステータスがどのように機能するかを簡単な例で観察できます。 終了ステータス評価の取得は、変数 $?を介して行われます。

$ let "b=-1, k=0"; echo $?
1
$ let "b=0, k=0"; echo $?
1
$ let "b=0, k=1"; echo $?
0

2.5. 数学演算

letコマンド構成の割り当てステートメント内で許可される数学演算は多数あります。 以下に、優先順位の重要度の高い順に演算子を示します。 同じ行にいるオペレーターは、同じレベルの優先順位を付与します。

数学演算子の優先順位は、次のリストによって決定されます(一番上の優先順位が最も高く、一番下が最も低い優先順位)。

  • ポストインクリメント、ポストデクリメント( id ++ id–
  • 事前インクリメント、事前デクリメント( ++ id –id
  • 単項マイナス、単項プラス( +
  • 論理否定、ビットごとの否定(
  • べき乗( **
  • 乗算、除算、余り(モジュロ)( * /
  • 足し算、引き算( +
  • ビット単位のシフト( << >> )。
  • 数値比較( < >> <= > = )。
  • 平等、不平等( == !=
  • AND(ビット単位 )。
  • XOR(ビット単位 ^
  • または(ビット単位 |
  • 論理積( && )。
  • 論理OR( ||
  • 三項演算子( )。
  • 割り当て( = * = / = %= + = -= << = >> = &= ^ = | = )。
  • 式リスト演算子( )。

複数の演算子を含む式がある場合、これらを括弧で適切に集約すると、デフォルトの実行優先順位が変更される可能性があります。 括弧内のステートメントを使用すると、オペレーターの評価は、合理的に選択された構造に従って高度な順序で実行できます。 このように、並べ替えのタイプは、上記のリストで説明されているように、標準操作の評価の優先順位をオーバーライドする場合があります。

結論として、数値表現を洞察すると、0で始まる数式は8進数をネイティブに表します。 さらに、先頭の0xまたは0X文字は、16進数を示します。 同様に、接頭辞base#を使用して、2〜64の範囲の別の算術基数に数値を適用できます。この接頭辞がない場合は、デフォルトで標準の基数10を使用します。

3. letコマンドの代替オプション

let コマンドは、変数の割り当てと数学演算に関連する特定の機能と拡張機能を提供します。 ただし、これは、標準の変数割り当てアプローチが同様のタスクに不適格であることを意味するものではありません。

算術演算の評価に関しては、算術評価(())および算術展開$(())構成は、同等の作業を実行します。 それらの違いは、主に直接的または間接的な割り当ての意味にあります。 この事実を次の簡単な例で説明します。

$ a=3; n=50; ((x=a+n)) ; echo $a, $n, $x
3, 50, 53
$ a=3; n=50; x=$((a+n)) ; echo $a, $n, $x
3, 50, 53

一般に、割り当て演算子と二項演算子の前後にスペースを使用することはできません。 しかし、 let コマンドでは、integer属性をオンにすることで、このような便利さを利用できます。 次の例では、これが実際にどのように機能するかを追跡できます。 たとえば、剰余演算子’%’と論理ビットシフト演算子'<<‘を使用します。

$ declare -i customVar1; customVar1="9 % 5"; echo $customVar1
4
$ x=2; declare -i customVar2; customVar2="8 << x"; echo $customVar2
32

この特徴的なケースでは、変数customVar1およびcustomVar2は、組み込みコマンドdescribeを介して整数値を想定しています。 このコマンドは、letコマンドフレーバーで算術演算を実行する機能を提供します。

あるいは、算術式を評価できる同様のコマンドは、コマンドexprです。 それでも、これは算術演算を同等に実行できますが、わずかに特殊な構文規則が必要になります。 以下でこれらの特定のプロパティを調べてみましょう。

最初に、算術演算子はスペースで囲む必要があります。

$ expr 2 + 9
11

さらに、乗算(*)演算子や除算(/)演算子などの特定の演算子には、プレフィックスとしてエスケープ文字’\’が必要です。 例えば:

$ expr 3 \* 22
66
$ expr 15 \/ 4
3

さらに、数値比較演算子は二重引用符で囲む必要があります。

$ x=5; y=18 ; expr  $x ">" $y
0

最後に、可変展開を使用した操作は通常のモードで発生します。

$ x=5; y=18 ; expr  $x + $y
23

4. 標準割り当ての場合との主な違い

let コマンド構造は、一般的な代入操作とは異なるさまざまな機能を備えて実装されています。 以下では、2つのケースの最も重要な違いを強調します。

  • 評価パラメータ拡張プレフィックス記号「$」を使用しない変数の参照
  • 1つのステートメントでの複数の割り当ての使用(二重引用符で囲まれた構文タイプ)
  • null値は0と評価されます
  • 代入演算子’=’または任意の二項演算子(二重引用符で囲まれた構文タイプ)の前後にスペースを任意に使用する可能性
  • ローカルスコープ環境
  • 右端に割り当てられた値に応じた特定の終了コードの戻り値
  • べき乗、r emainder計算(モジュロ)、および論理演算(OR、AND、XOR、ビットシフト、および数値反転)として算術演算を実行する可能性

5. 結論

現在の記事では、letコマンドの最も重要な特性について説明しました。 コマンドタイポロジーの詳細な検査を行いました。 さらに、言及されたすべての主題の例を通じて、その特性と特徴を示しました。

続いて、変数の割り当てと算術演算に関する標準の対応する構成要素との比較が行われます。 結論として、算術評価を実行するための代替の競合演算子を強調しました。