宿題:表現ですか、命令ですか?

宿題:表現ですか、命令ですか?

Bash および Posix シェルにはさまざまな形式のコマンドがあります。推測が正しい場合、割り当てはコマンド(特に単純なコマンド)の一種です。

ただし、let割り当ての前に使用でき、let式の前に使用する必要があります。だから私の言葉が正しいなら、割り当ても表現だ。

let有無にかかわらず、割り当てはすべてコマンドとして使用されます。 2つの違いは何ですか?私が主に尋ねるのは、用途の違い、つまりいつどのようなものを使用すべきかです。例えば

$ aaa=1

$ let aaa=1

答え1

let <EXPRESSION>それ自体はPOSIX規格ではありませんが、POSIX規格の方法で次のように表現できます。

[ "$(( <EXPRESSION> ))" -ne 0 ]

通常の割り当てとは異なり、割り当てlet(式)も評価し、結果に応じて終了コードを返します。

$ aaa=1; echo $?
0
$ aaa=0; echo $?
0

$ let aaa=1; echo $?
0
$ let aaa=0; echo $?
1

答え2

私が知る限り、letいいえPOSIX互換住宅検査同意する:

$ cat test.sh
#!/bin/sh
let a=3

$ shellcheck test.sh
In test.sh line 2:
let a=3
^-- SC2039: In POSIX sh, 'let' is undefined.

これバッシュのマニュアルページ説明する:

((expression))

式は、以下の算術評価で説明されている規則に従って評価されます。式がゼロでないと評価された場合、戻り状態は0で、そうでない場合は戻り状態は1です。これは let "expression" とまったく同じです。

そして

算術評価

シェルは特定の状況で算術式の評価を可能にします(組み込みコマンドと算術拡張 let と宣言を参照)。ゼロで割ることが捕捉され、エラーとしてマークされても、評価は固定幅整数で実行され、オーバーフローは確認されません。演算子とその優先順位、結合性、値はC言語と同じです。次の演算子のリストは、同じ優先順位の演算子ごとにグループ化されています。レベルは、優先順位の低い順にリストされます。

= *= /= %= += -= <<= >>= &= ^= |= 仕事

そして

let arg [arg ...] 各引数は評価する算術式です(上記の算術評価を参照)。最後のパラメータの値が0の場合、letは1を返し、そうでない場合は0を返します。

したがって、bashでは割り当ても式であり、 を使用して1つ以上の式を評価できるため、let単一のlet。しかし、上記のようにPOSIXと互換性がありません。

答え3

これはすぐ下の文書にlet式が必要であることを示しています。

表現を見よう [表現式...]

let 組み込みコマンドを使用すると、シェル変数に対して算術演算を実行できます。各式は、以下の規則に従って評価されます。シェル算術最後の式が0と評価された場合、letは1を返し、そうでない場合は0を返します。

シェル算術代入演算子=、、、、、、、、、、、、、およびを含みます*=。​​​​通常、これは追加の処理を適用しない一般的な割り当て文とは何の関係もありません。/=%=+=-=<<=>>=&=^=|=

答え4

変数の割り当ては式やコマンドではなく、「単純なコマンド」構文の一部です。割り当てはコマンドワードの前に表示され、コマンドのコンテキストを変更できます。コマンドなしで割り当てが発生すると、現在のシェルの環境が変更されます。

望むより:https://www.gnu.org/software/bash/manual/html_node/Simple-Command-Expansion.html

この回答も参照してください。 このシェル/ Bashの構文は何ですか:someVariable = someValue someCommand

let@Michael Homerが指摘したように、独自の構文と代入演算子を実装するBash組み込みコマンドです。 help let便利な参考資料を提供してください。

関連情報