GNU/Linux >> Linux の 問題 >  >> Linux

Bashスクリプト(II)

これは、GnuBashスクリプトに焦点を当てたシリーズの2番目の記事です。最初のbashスクリプトの記事では、最も単純なスクリプト、つまり単純なコマンドを次々に作成しました。また、いくつかの変数の使用も確認しました。この記事では、bash制御構造について説明します。

制御構造

前回の記事で述べたように、怠惰は成功への鍵です。いくつかのコマンドを実行する必要がある場合は、しばらくしてから同じコマンドを同じ順序で実行します。3回目になると、テキストエディタを開き、それらのコマンドを貼り付けてスクリプトとして保存します。

数日後、そのスクリプトは拡張性と複雑さの両方で成長し始めます。実行フローを制御する方法が必要です。例:

  • 何かが起こった場合は何かをし、何かが起こらなかった場合は別のことをします。
  • 何かが起こっている間、何かを何度も繰り返すか、何かを何度も繰り返します。
  • または、変数の値や何が起こったかに応じて、これまたはそれまたは別のことを行います。
  • etc

これは、bash制御構造が意図されているものです(実際には、bashまたはその他のプログラミング言語で)。ただし、最初に、次のことを知っておく必要があります。

終了ステータス

bashのマンページから:

«実行されたコマンドの終了ステータスは、waitpidシステムコールまたは同等の関数によって返される値です。終了ステータスは0から255の間にあります。 (…)終了ステータスがゼロの場合は成功を示します (または、「true」に等しい)。 ゼロ以外の終了ステータスは失敗を示します (または、「false」に等しい)(…。例:) コマンドが見つからない場合、コマンドを実行するために作成された子プロセスは、127のステータスを返します。コマンドが見つかったが実行可能でない場合、返品ステータスは126です »。

tl; dr:0の終了法は真を意味します 、 成功; その他の値はfalseを意味します 。真/偽の決定を実行することはコマンドの終了ステータスを確認することであるため、これを学ぶことが重要です。

Bashは、最後に実行されたコマンドの終了ステータスを $?に保存します。 変数。

if-then-else

これは何かが起こった場合です (何かが発生するということは、終了ステータスがゼロのコマンドを意味します)何かをする 、または別のことをします。構文は次のとおりです。

if command
then
	command1
	command2
	...
else
	commandA
	commandB
	...
fi

スクリーンショットでわかるように、すべてのコマンドをセミコロンで区切って1行で書くことができます:

if command; then command1; command2;...; else commandA; commandB;...;fi

if-thenブロックの複雑さに応じて、「ワンライナー」スタイルが読みやすくなったり、読みにくくなったりする可能性があります。

何かが起こった場合に何らかのコマンドを実行したい場合は、他の何かの場合にのみ別のコマンドを実行してください。 起こりますか?キーワードelif(else if)を使用します:

if command
then
	command1
	command2
	...
elif other_command
	commandA
	commandB
	...
else
	another block of commands
fi

if-then-elseブロックは、キーワード fiで終了します。 (後方の場合)。

文字列と数値の比較

変数を覚えていますか?頻繁に何かが起こる 変数の値に応じて、いくつかのコマンドまたはその他を実行したいということです。
文字列が他の単語よりも小さい単語または数字と等しいかどうかを比較するには、コマンド testを使用します。 。一般的な構文は次のとおりです。

test expression

の場合 falseと見なされて省略されます(終了ステータス> 0)。 の場合 それは本当のテキストの文字列です。これには注意が必要です。例:

$ test false; echo $?
0

コマンドfalseの終了ステータスはテストしていません(コマンド falseがあります )しかし、文字列は何に対しても偽です。テストコマンドを実行するもう1つの方法は、式を角かっこで囲むことです。この別の方法は、if-then-elseブロック内で読みやすくなります。

オペランド 真の場合
true
!式 false(式を無効にします)
expressionA -a expressionB そして。両方の式が正しい
expressionA -o expressionB または。式の1つが正しい
string1 =string2 両方の文字列が等しい
string1!=string2 文字列が異なります
int1 -eq int2 integer1はinteger2と等しい
int1-ge int2 int1> =int2
int1 -gt int2 int1> int2
int1 -le int2 int1 <=int2
int1 -lt int2 int1
int1 -ne int2 int1はint2と等しくありません
-eファイル ファイルが存在します
-dディレクトリ ファイルが存在し、ディレクトリです

もっと多くの表現があります、それらは私がより重要だと思うものです。テスト用のマンページを読んで、他の表現を学びましょう。

両方の角括弧と式の間にスペースがあることに注意してください。これで、テストを使用して何かを行うことができます 変数の値に基づきます。例:

ケース

複数の値に対して変数をテストする場合は、次のようにif-then-elseブロックに複数のelifを追加できます。

if [ $a = "value1" ]
then
	command1 for value1
	...
	commandN for value1
elif [ $a = "value2" ] 
then
	command1 for value2
	...
	commandN for value2
...
elif [ $a = "valueN" ] 
then
	command1 for valueN
	...
	commandN for valueN
else
	command1 for every other value
	...
	commandN for every other value
fi

または、読みやすく、書きやすいcaseコマンドに置き換えることもできます。

case expression in
	value1)
		command1 for value1
		...
		commandN for value1
		;;
	value2)
		command1 for value2
		...
		commandN for value2
		;;
	...
	*)
		command1 for every other value
		...
		commandN for every other value
		;;
esac

また、キーストロークを減らして、コンピュータを機能させるのに十分な怠惰になることを忘れないでください。最後の値* これはデフォルトのケースであり、他のすべての値は以前は一致していません。ケースバック、 esac 、彼のfiステートメントに類似しています。 ;;の場合 演算子が使用され、最初のパターン一致の後に後続の一致は試行されません。次のパターンをテストするには、;; *を使用します オペレーター。例:

しばらくの間

何かが起こっている間、何度も何度も何かをしている間。そして、までは同じですが否定されます(何かが起こっていない間に何かを何度も繰り返します)。一般的な構文は次のとおりです。

while command
do
	command1
	command2
	...
	commandN
done

発生していないときに何かを実行するには(つまり、存在ステータスが0とは異なる)、whileをuntilに置き換えます。いくつかの例を参照してください:

同じ出力が生成されなかったことに注意してください。 whileブロックでは、$ aが値4に達すると、4以上であるため、テストはfalseと評価されます(終了コードは> 0です)。 untilブロックで、$ aが値4に達したとき、4以下です。

端末の時計

cronジョブをテストしていると、実行されるまで不安になることがあります。条件としてtrueコマンド(ご想像のとおり、0の終了ステータスを生成します)を使用し、コマンドdateを何度も実行します:

while true
do
	date
	sleep 1
	clear
done

これはfovererを実行しますが、ctrl-cで中断できます。

for-in -する

この種のループは、各項目を変数に割り当てて提供されるリストを繰り返し処理します。構文:

for i in list of words
do
	command1
	...
	commandN
done

これは例で見やすくなっています:

お楽しみに

物事は複雑になりつつありますが、私たちはスクリプトにこれまたはそれを行うためのいくつかの決定を下してもらいたいと思っています。他のテーマについても取り上げる予定でしたが、bash制御構造に関するこの記事は大きくなりすぎました。

次は、パイプとリダイレクトについて説明します。おそらく、このbash制御構造に例を挙げて説明します。たとえば、for-inループでコマンドの出力を使用するようなものです。


Linux
  1. Bashスクリプト(I)

  2. Bashの「評価」コマンド?

  3. jenkins パイプラインで bash コマンドを実行する

  1. Bashトラップコマンドの説明

  2. Bash待機コマンド

  3. bash エクスポート コマンド

  1. Bash読み取りコマンド

  2. バッシュヒアドキュメント

  3. Bashソースコマンド