Ifステートメント!
決定、決定。
はじめに
Bash ifステートメントは非常に便利です。 Bashスクリプトチュートリアルのこのセクションでは、Bashスクリプトでifステートメントを使用してタスクを自動化する方法を学びます。
If文(および密接に関連するcase文)により、Bashスクリプトで決定を下すことができます。 これらは、私たちが設定する条件に基づいてコードを実行するかどうかを決定することを可能にします。, Ifステートメントとループ(次のセクションで見ていきます)を組み合わせることで、より大きなタスクを解決するより複雑なスクリプトを作成できま
前のセクションで見てきたように、それらの構文は非常に具体的なので、すべての小さな詳細の上に滞在します。
基本的なIf文
基本的なif文は、特定のテストが真であれば、与えられた一連のアクションを実行すると効果的に言います。 それが本当でなければそれらの行為を行ってはいけない。, 以下の形式に従う場合:
if
then
<コマンド>
fi
thenとfiの間(後方の場合)は、テスト(角括弧の間)が真の場合にのみ実行されます。
簡単な例を見てみましょう:
if_example.sh
- #!/bin/bash
- #基本的なif文
- if
- then
- echoちょっとそれは大きな数です。これは、/bin/bashの場合、/bin/bashの場合、/bin/bashの場合、/bin/bashの場合、/bin/bashの場合、こんにちは。,
- pwd
- fi
- date
分解してみましょう。
- 4行目-最初のコマンドライン引数が100より大きいかどうかを見てみましょう。
- 6行目と7行目-4行目のテストがtrueを返す場合にのみ実行されます。 ここでは、好きなだけ多くのコマンドを使用できます。
- 6行目-一重引quoteにはbashの特別な意味があり、その特別な意味は必要ありませんので、一重引quote(’)の前にある円記号(\)が必要です。 バックスラッシュは特別な意味をエスケープして、通常の単純な単一引quoteにします。,
- 8行目-fiはifステートメントの終わりを示します。 これ以降のすべてのコマンドは通常通り実行されます。
- 10行目-このコマンドはif文の外側にあるため、if文の結果に関係なく実行されます。
- ./if_example.sh 15
- 金5Feb9:06:30 2021
- ./if_example.sh 150
- こんにちは、それは多数です。
- /home/ryan/bin
- Fri5Feb9:06:30 2021
可能なさまざまなシナリオをカバーする入力でスクリプトをテストすることは常に良い習慣です。,
Test
上記のifステートメントの角かっこ()は、実際にはコマンドtestへの参照です。 これは、testが許可するすべての演算子をここでも使用できることを意味します。 Testのmanページを調べて、可能なすべての演算子(かなりの数があります)を見てくださいが、より一般的なもののいくつかを以下に示します。
オペレータ | 説明 | |
---|---|---|
! 式 | 式はfalseです。 | |
-n STRING | 文字列の長さがゼロより大きい。,-z STRING | 文字列の長さはゼロです(つまり、空です)。 |
STRING1=STRING2 | STRING1はSTRING2に等しい | |
STRING1!=STRING2 | STRING1はSTRING2と等しくありません | |
INTEGER1-eq INTEGER2 | INTEGER1はINTEGER2と数値的に等しい | |
INTEGER1-gt INTEGER2 | INTEGER1はINTEGER2より数値的に大きい | |
INTEGER1-lt INTEGER2 | integer1はinteger2より数値的に小さい | |
-d file | FILEが存在し、ディレクトリです。, | |
-eファイル | ファイルが存在します。 | |
-rファイル | ファイルが存在し、読み取り権限が付与されています。tr> | |
-sファイル | ファイルが存在し、そのサイズがゼロより大きい(つまり。 それは空ではありません)。 | |
-wファイル | ファイルが存在し、書き込み権限が付与されています。 | |
-x FILE | ファイルが存在し、実行権限が付与されています。 |
注意すべきいくつかのポイント:
- =は-eqとは若干異なります。 =が文字列比較を行うのでfalseを返します(つまり。, 同じ文字の文字)一方、-eqは数値比較を行い、意味はtrueを返します。
- 上記のファイルを参照するとき、実際にはパスを意味します。 パスは絶対パスまたは相対パスであり、ファイルまたはディレクトリを参照することができます。
- コマンドテストへの単なる参照であるため、コマンドラインでテストを試してトラブルシュートし、その動作の理解が正しいことを確認します。
- テスト001=1
- エコー$?
- 1
- テスト001-eq1
- echo$?,
- 0
- タッチmyfile
- テスト-s myfile
- echo$?
- 1
- ls/etc>myfile
- test-s myfile
- echo$?
- 0
それを分解してみましょう:
- 1行目-文字列ベースの比較を実行します。 Testは結果を出力しないので、代わりに次の行で行う終了ステータスをチェックします。
- 2行目-変数$? 以前に実行したコマンド(この場合はtest)の終了ステータスを保持します。 0は真(または成功)を意味します。 1=FALSE(または失敗)。,
- 4行目-今回は数値比較を行っています。
- 7行目-新しい空白ファイルmyfileを作成します(myfileがまだ存在しないと仮定します)。li>
- 8行目-myfileのサイズはゼロより大きいですか?
- 11行目-一部のコンテンツをmyfileにリダイレクトして、サイズがゼロより大きくなるようにします。
- 12行目-myfileのサイズをもう一度テストします。 今回はそれが本当です。
インデント
上記のifステートメントでは、ステートメントがtrueの場合に実行されたコマンドをインデントしていることがわかります。, これはインデントと呼ばれ、(Bashスクリプトだけでなく、どの言語でも)良い、きれいなコードを書く上で重要な部分です。 目的は可読性を改善し、私達が簡単で、愚かな間違いをすることをより堅くさせることである。 Bashにはインデントに関するルールはないので、好きなようにインデントするかインデントしないかでき、スクリプトはまったく同じように実行されま しかし、あなたのコードをインデントすることを強くお勧めします(特にスクリプトが大きくなるにつれて)そうしないと、スクリプトの構造を見ること,
ネストされたIfステートメント
インデントの話。 ここにそれがあなたのために人生を楽にするときの完璧な例があります。 スクリプト内に必要な数のifステートメントがある場合があります。 また、別のif文の中にif文を持つこともできます。 たとえば、コマンドラインで与えられた数値を次のように分析したい場合があります。
分解してみましょう。
- 4行目-最初のコマンドライン引数が100より大きい場合にのみ、次のように実行します。
- 8行目-これはifステートメントの軽いバリエーションです。, 式をチェックしたい場合は、変数の場合と同じように二重括弧を使用できます。
- 10行目-両方のifステートメントがtrueの場合にのみ実行されます。
ようdawg、私はあなたがif文が好きなので、私はあなたのif文の中にif文を入れます。
Xzibit
(Xzibitは実際にはそれを言っていませんでしたが、私は彼がPimp私のBashスクリプトをホストしていたと確信しています。,あなたは好きなだけ多くのif文を入れ子にすることができますが、3つ以上のレベルを深く入れ子にする必要がある場合は、おそらくあなたのロジッ
If Else
ステートメントがtrueの場合は特定のアクションセットを実行し、falseの場合は別のアクションセットを実行したい場合があります。 私達はelseのメカニズムとのこれを収容してもいい。,
if
then
<コマンド>
else
<その他のコマンド>
fi
コマンドライン引数として指定されている場合、ファイルから簡単に読み取ることができます。標準入力から。
else.sh
- #!/bin/bash
- #else example
- if
- then
- nl$1
- else
- nl/dev/stdin
- fi
If Elif Else
時には、異なるパスにつながる一連の条件があるかもしれません。,
if
then
<コマンド>
elif
then
<異なるコマンド>
else
<その他のコマンド>
fi
たとえば、あなたが18歳以上の場合は、パーティーに行くことができる場合があります。 そうでないが、あなたの親からの手紙を有すれば行くかもしれないが、真夜中の前に戻らなければならない。 そうでなければ行けない
elifブランチを好きなだけ持つことができます。 最後のelseもオプションです。,
ブール演算
時には、複数の条件が満たされている場合にのみ何かをしたい場合があります。 その他の回しを行いたいのですが、場合にいくつかの条件が満たされた. これらはブール演算子で対応できます。
- と-&&
- または-||
たとえば、ファイルが読み取り可能で、サイズがゼロより大きい場合にのみ操作を実行したいと思います。
and.sh
- #!,/bin/bash
- #および例
- if&&
- その後
- echoこのファイルは便利です。
- fi
ユーザーがbobまたはandyのいずれかであれば、少し違うことを実行したいかもしれません。
or.sh
- #!/bin/bash
- #or example
- if//
- then
- ls-alh
- else
- ls
- fi
Caseステートメント
一連のパターンに一致する変数に基づいて異なるパスを取りたい場合があります。, 私たちは一連のif文とelif文を使用することができますが、それはすぐに不安定になるでしょう。 幸い場合がございま算できることのないようクリーナーです。, It’s a little hard to explain so here are some examples to illustrate:
case <variable> in
<pattern 1>)
<commands>
;;
<pattern 2>)
<other commands>
;;
esac
Here is a basic example:
case.sh
- #!,/bin/bashの
- #ケース例
- ケース$1で
- 開始)
- エコー開始
- ;;
- 停止)
- エコーストーピング
- ;;
- 再起動)
- エコー再起動
- ;;
- *)
- エコー再起動
- ;;
- *)
- エコードン\’t know
- ;;
- esac
それを分解してみましょう:
- 4行目-この行はケースメカニズムを開始します。
- 5行目-$1が’start’と等しい場合は、後続のアクションを実行します。 )はパターンの終わりを示します。,
- 7行目-この一連のステートメントの終わりを二重のセミコロン(;;)で識別します。 これに続くことは考慮するべき次の場合である。
- 14行目-各ケースのテストはパターンであることに注意してください。 *は任意の数の任意の文字を表します。 他のケースのどれも一致しない場合は、本質的にすべての場合にキャッチされます。 それは必要ではありませんが、よく使用されます。
- 17行目-esacは大文字と小文字を逆にしており、case文の最後にあることを示しています。 これ以降の他の文は正常に実行されます。
- ./case.sh スタート
- スタート
- 。,/case.sh リスタート
- リスタート
- 。/case.sh blah
- don’t know
では、パターンがもう少し使われているもう少し複雑な例を見てみましょう。
Summary
アクティビティ
では、いくつかの決定を下しましょう。
- コマンドライン引数として2つの数字を取るBashスクリプトを作成します。 これは、二つの数字の大きい画面に印刷されます。,
- コマンドライン引数としてファイルを受け入れ、特定の方法で分析するBashスクリプトを作成します。 例えば— ファイルが実行可能か書き込み可能かを確認できます。 ま印刷するには一定のメッセージtrueの場合は、別の場合はfalseになります。
- どの曜日に基づいてメッセージを出力するBashスクリプトを作成します(例えば。 水曜日のための”幸せなこぶの日”、金曜日のための”TGIF”など)。