$ true の場合は YES、それ以外の場合は NO をエコー、false の場合は YES をエコー、それ以外の場合は fiNO をエコーします。
$ true の場合 && true; then echo NO; true の場合 && false; then echo NO; false の場合 fiNO$; ;その場合は YES をエコーし、それ以外の場合は fiNO をエコーします。
|| true の場合は YES、そうでない場合は fiYES$、false の場合は fiYES$、そうでない場合は fiYES$ を返します。 false || false; それ以外の場合は fiNO をエコーします。
$ ! false の場合、エコー YES; それ以外の場合、エコー fiYES; そうでない場合、エコー fiNO;
見えるよ
真実そして
間違い論理演算の理解に従って進めますが、シェルの論理演算の実装をより深く理解するには、次のことを理解する必要があります。
真実そして
間違いどのように機能するのでしょうか?
答えは「いいえ」です。
真実そして
間違いこれらはそれ自体は論理値ではなく、すべてシェルの組み込みコマンドですが、戻り値は「論理値」です。
$ true$ エコー $?0$ false$ エコー $?1
見える
真実0を返し、そして
間違いその場合は 1 が返されます。これは、離散数学で学んだ真の値 1 と 0 に対応するものではなく、その逆です。
$ help true falsetrue: true 成功した結果を返します。false: false 失敗した結果を返します。$ type true falsetrue はシェル組み込みです。false はシェル組み込みです。
例証します:
$?最終プロセスの終了ステータス(終了ステータスコード)を格納する特殊変数です。
上記の操作から、なぜ C 言語プログラミングが重視されるのかを考えるのは難しくありません。
主要関数の前に追加します
整数、最後に追加します
0を返す。シェルでは、プログラムが正常に終了したかどうかの記号として 0 が使用されるためです。
真実そして
間違い本質的に、これらは、従来の true と false の値 (1 と 0) ではなく、特定のプログラムが正しく終了したかどうかを反映するために使用され、逆に 0 と 1 を返します。幸いなことに、論理演算を実行するときにこれらについて心配する必要はありません。
前のセクションで、Shell の「論理値」が何であるかを明確に理解しました。これは、プロセスが正常に終了した場合の戻り値であり、失敗した場合は false です。
そして、条件付きテストは単に使用します
テストこのような命令は、数値テスト (さまざまな数値属性テスト)、文字列テスト (さまざまな文字列属性テスト)、およびファイル テスト (さまざまなファイル属性テスト) を実行するために使用され、さまざまな定型タスクを完了した後に、対応するテストが成功したかどうかを判断します。 、さまざまなテストの論理的な組み合わせと組み合わせることで、より複雑なタスクを完了できます。
$ if test 5 -eq 5; then echo YES; else echo fiYES$ if test 5 -ne 5; then echo fiNO;
$ テスト -n が空でない場合は YES をエコー; テスト -z が空でない場合は fiYES をエコー; テスト -z が空でない場合は FIYES をエコー;テスト -n の場合は YES をエコーし、そうでない場合は fiNO をエコーします。
$ テスト -f /boot/System.map の場合、エコー YES; それ以外の場合、エコー fiYES; テスト -d /boot/System.map の場合、エコー YES;
$ a=5;b=4;c=6;$ if テスト $a -eq 5 -a $b -eq 4 -a $c -eq 6; else echo fiYES;
$ if test -f /etc/profile -o -d /etc/profile; then echo YES; else echo fiYES;
!操作ではありません
$ if テスト ! -f /etc/profile; それ以外の場合は fiNO をエコーします。
上記は単に説明するだけです
テスト合格できる非常に簡単なテストをいくつか命令する
ヘルプテスト得る
テストのさらなる使用法。注意すべき点は、
テストコマンド内の論理演算とシェルの論理演算子の間にはいくつかの違いがあります。対応するものは次のとおりです。
-aそして
&&、
-oそして
||、この 2 つを混同することはできません。オペレーションが存在するのではなく、
!、以下で比較してください。
$ cat > test.sh#!/bin/bashcho test[CTRL+D] # CTRL と D のキーの組み合わせを押して cat 入力を終了します。以下と同じです。$ chmod +x test.sh$ if test を指定しなくなりました。 -s test .sh -a -x test.sh; then echo YES; else echo NO; if test -s test.sh && test -x test.sh;
$ str1=test$ str2=test$ if test -z $str2 -o $str2 == $str1; then echo YES; else echo NO; test -z $str2 == $str1;その場合は YES をエコーし、それ以外の場合は fiYES をエコーします。
$ i=5$ if テスト $i -lt 5 -a $i -ne 6; else echo fiYES$ if ! ; それ以外の場合は NO をエコーします。
それらの違いを見つけるのは簡単ですが、
-aそして
-oテストコマンドのパラメータとして、テストコマンド内で使用され、
&&そして
||テストの戻り値を計算するために使用されます。
!両方に共通です。注意が必要なのは次のとおりです。
必要ない場合もあります
!演算子など
-eqそして
-ねまったく逆に、2 つの値が等しいかどうかをテストするために使用できます。
-zそして
-nこれは、特定の文字列が空かどうかをテストするためにも対応しており、使用されます。
存在する
バッシュ内部、
テストコマンドは [] 演算子で置き換えることができますが、[
その後は] の前に余分なスペースを入れる必要があります
文字列をテストするときは、変数の内容が空のときにテスト パラメーターのみが存在し、テストの内容が存在しない状況を避けるために、すべての変数を二重引用符で囲むことをお勧めします。
以下では、例を使用して上記の 3 つの予防策を説明します。
-ねそして
-eqそれに応じて、場合によっては
!手術
$ i=5$ の場合は $i -eq 5、それ以外の場合は fiYES$ をエコー、$i -eq 5 の場合はエコー、その場合は YES をエコーし、それ以外の場合は fiNO をエコーします。
使用
[ ]交換できます
テスト、より「美しく」見えます。
$ if [ $i -eq 5 ]; then echo YES; else echo fiYES$ if [ $i -gt 4 ] && [ $i -lt 6 ]; then echo fiYES;
いくつかの文字列変数を忘れずに追加してください
、覚えて[その後は
】前に余分なスペースを追加します
$ str=$ if [ $str = test]; else echo NO; [: `]'NO$ if [ $str = test ]; then echo fi- bash: [: =: 単項演算子 ExpectNO$ if [ $str = test ] then echo YES; else echo NO;
この時点で、コマンド リストは以下に紹介されています。つまり、複数のテスト コマンドを組み合わせたものです。
&&、
||そして
!結合された一連のコマンド。この一連のコマンドは、効果的に
もし/それから条件分岐構造。 C 言語プログラミングでよく行う次のような多肢選択の質問を考えるのは難しくありません (非常に退屈な例ですが、意味はあります): 次の内容は出力されますか?
j、印刷される場合、何が印刷されますか?
#include <stdio.h>int main(){ int i, j; i=5;j=1; if ((i==5) && (j=5)) printf(%dn, j); 0 を返します;}
数字の 5 が印刷されることは簡単にわかります。
i==5この条件が成り立つと、その後、
&&、全体の条件が成立しているかどうかを判断するには、その後の判断を行う必要がありますが、この判断は従来の判断ではなく、まず
jこれを 5 に変更してから true 値に変換すると、条件は true となり 5 が出力されます。したがって、この文は次のように解釈できます。
私が 5 に等しい場合は、
j次の場合は、値 5 を割り当てます。
jが 1 より大きい場合 (前にすでに true であったため)、出力します。
j価値。このように使ってください
&&連結された判決文は 2 つの判決文を置き換えます
もし条件分岐ステートメント。
これは、渡すことができる論理演算の固有の特性に正確に基づいています。
&&、
||交換する
もし/それから条件分岐構造を待ち、コマンドリストを生成します。
コマンドリストの実行規則は論理演算の動作規則に準じます。
&&接続されたコマンドの場合、前者が正常に返された場合は次のコマンドが実行され、それ以外の場合は次のコマンドが実行されます。
||接続されたコマンドが正常に返された場合、後続のコマンドは実行されません。また、その逆も同様です。
$ ping -c 1 www.lzu.edu.cn -W 1 && echo =======接続済み========
非常に興味深い疑問が生じます。これは上で述べたことです。なぜ C プログラムを次のようにする必要があるのですか。
主要()関数は最後に0を返しますか?そうでない場合、この種のプログラムをコマンド リストに追加するとどのような結果が生じるでしょうか?自分で簡単な C プログラムを作成し、それをコマンド リストに入れて確認します。
代わりにコマンド リストが使用される場合もあります
もし/それから条件付き分岐構造により、一部のコードが節約され、プログラムがより美しく、読みやすくなります。次に例を示します。
#!/bin/bashcho $#echo $1if [ $# -eq 1 ] && (echo $1 | grep ^[0-9]*$ >/dev/null);then echo YESfi
注: 上記の例では、パラメーターの数が 1 で、タイプが数値である必要があります。
プラス
出口1、省略させていただきます。
もし/それから構造
#!/bin/bashcho $#echo $1! ([ $# -eq 1 ] && (echo $1 | grep ^[0-9]*$ >/dev/null)) && exit 1echo YES
この処理を行うと、プログラムパラメータの判定が1行のコードで済むようになり、より美しくなります。
このセクションでは、シェル プログラミングにおける論理演算、条件テスト、コマンド リストについて紹介します。