高度なシェルスクリプト
循環
- サイクル実行
- 繰り返しのコードセグメントは、複数回実行します
- 何回は実行を繰り返します
- 事前に知らサイクル
- 事前に知らサイクル
- エントリー条件と終了基準があります。
- まで、しばらく、用
forループ
for VAR in [list];do
CODE
done
- 「変数名」に割り当てられた要素をリストするために、ループ本体の実行後にそれぞれ割り当て、リストの要素が使い果たされるまで、サイクルの終わり:実施メカニズム
- リストビルダー方法:
- (1)直接のリストを与えます
- (2)整数のリスト:
- (A){} start..end
- (b)は$(配列[開始[ステップ]エンド)
- (3)コマンドのリストを返します
- $(COMMAND)
- (4)のような:. * Shのグロブの使用を
- (5)変数の参照
- $ @、$ *
特別なフォーマットのための
- 二重括弧の方法、すなわち、((...))の形式は、算術演算のためにも使用することができます
- また、変数の操作C-スタイルを達成することができるダブル括弧のbashシェル方法
- I = 10
- ((I ++))
- 特別なフォーマットを循環させます。
for ((控制变量初始化;条件判断表达式;控制变量的修正表达式))
do
循环体
done
- 制御変数が初期化されますと、ループスニペット操作のみが行われます
- 補正式制御変数:各サイクルの終了は、補正演算制御変数を実行した後、条件が何を決定します
whileループ
while CONDITION; do
循环体
done
- CONDITION:ループ制御条件、ループに入る前に、まず裁判官を行い、再びループする前に判断をするたびに、条件が「真」である場合、ループを実行し、条件のテストステータスが「false」がループを終了するまで、
- こうして:CONDTIONは一般にループ制御変数を有するべきであり、この変数の値は、ループ内に固定され続けます
- エントリー条件:条件が真であります
- 終了条件:条件が偽
ループまで
until CONDITION; do
循环体
done
- エントリー条件:条件が偽であります
- 終了条件:条件が真であります
ループ制御文は継続します
- ループ本体
- [N]を続ける:N前方ラウンドループ層の端部の、直接次のラウンドに決定され、最も内側の層を
第一層
while CONDTIITON1; do
CMD1
...
if CONDITION2; then
continue
fi
CMDn
...
done
ループ制御文ブレーク
- ループ本体
- [N]を破る:N、先行サイクルの終わりの最も内側の層を層第一層
while CONDTIITON1; do
CMD1
...
if CONDITION2; then
break
fi
CMDn
...
done
ループ制御変速指令
- シフト[N]
- 左のリストの指定された数のパラメータリストは、デフォルトでは、一旦抜けます。
- リストのパラメータリストが移動されると、パラメータの左端は、リストから削除することができます。引数のリストを横断しながら、位置ループは、シフトするために使用する場合
- ./doit.sh ABCDEFGH
- ./shfit.sh ABCDEFGH
特殊な使い方しばらく
- しばらく特殊な用法・サイクル(各ライン横断ファイル)
while read line; do
循环体
done < /PATH/FROM/SOMEFILE
- 順次各ライン/パス/ / somefileというからファイルを読み出し、可変ライン列に割り当てられます
メニューサイクルを選択
select variable in list
do
循环体命令
done
- 主に標準誤差の番号順にメニュー、メニューアイテムを作成するために使用されるサイクルが表示され選択し、
ユーザ入力のためのプロンプトを待つPS3を表示 - ユーザーがメニューリストに番号を入力し、対応するコマンドを実行します
- ユーザ入力がに保存されている組み込み変数REPLY *無限ループを選択し、そのbreakコマンドでループを終了、またはexitコマンドで終了心に留めておく
スクリプト。また、ループプレスCtrl + Cを終了することができます - 選択することが多い場合と組み合わせて使用
- 同様にループのために、あなたは、位置量を使用して、リスト内のこの時間を省略することができます
機能
機能紹介
- この関数は、コードの再利用とモジュールのプログラミング、シェルコマンドのいくつかの部分で構成機能ステートメントブロックです
- それは別のプロセスではないことを、独立して動作することができない以外は、シェルプログラムの形で類似しているが、シェルプログラムの一部
- ことを除いて同様のシェル関数や手続き、
- シェルサブシェルで実行されます
- Shell関数は、現在のシェルで実行されます。したがって、現在のシェルで、関数は、シェル変数を修正することができます
定義関数
- この関数は2つの部分から構成:関数名と関数本体*ヘルプ機能
- 文法:
f_name (){
...函数体...
}
- 文法II:
function f_name {
...函数体...
}
- 文法III:
function f_name () {
...函数体...
}
関数の使い方
- 関数を定義し、使用
- あなたは、インタラクティブな環境で関数を定義することができ
- そのの一部として、スクリプトファイルで機能することができます
- これは、機能のみを含む別のファイルに配置することができます
- 呼び出し:関数呼び出しにのみ実行されます
- コール:名前指定した関数
- ローカル関数名は、それがコードの関数として自動的に置き換えられます、表示されます
- ライフサイクル機能:作成は、終了リターンと呼ばれています
関数の戻り値
- 2つの関数の戻り値があります。
- 関数の戻り値の結果:
- エコーコマンドの出力を使用します
- 関数本体を呼び出すコマンドの出力
- 関数の終了ステータスコード:
- デフォルトでは、関数終了ステータスコードで最後に実行したコマンドに依存します
- 形式のカスタム終了ステータスコード:
- 関数からの戻り戻り、コマンドによって決定最終状態は、値を返します
- 戻り値0エラーは返されません
- エラーが返される1から255まで戻ります
インタラクティブ環境定義と使用機能
- 例:
dir() {
> ls -l
> }
- 関数の定義の後、型の$ DIRかの後、結果は、LSと同じ効果を示した-l
- 君
- Dir関数は、システムからユーザが終了するまで保持し、又は未設定の下に示すようにコマンドを実行しています
- あなたの設定を解除
スクリプト内の関数を定義して使用します
- 機能は、使用する前に定義する必要があり、シェルはそれを最初に発見されたまで、したがって、スクリプトに定義された関数の先頭である必要があり
、使用する前に - にのみ、関数名を使用して関数を呼び出します
- 例:
#!/bin/bash
# func1
hello()
{
echo "Hello there today's date is `date +%F`"
}
echo "now going to the function hello"
hello
echo “back from the function”
関数ファイルを使用します
- よく使う機能は、関数ファイルに保存することができ、機能ファイルは、シェルをロード
- ファイル名は任意に選択され、より良いような関連のタスク、といくつかの接続を持ってすることができます。functions.mainを
- ファイルは関数シェルをロードしたら、コマンドラインまたはスクリプトで関数を呼び出すことができます。あなたは、出力リストがすでにシェルロードされたすべての機能が含まれ、定義済みのすべての機能を表示するには、setコマンドを使用することができます
- 最初にunsetコマンドで、機能を変更するには、シェルから機能を削除します。変更が完了したら、次にこのファイルをリロード
関数ファイルを作成します。
機能ファイルの例:
CATのfunctions.main
#!/bin/bash
#functions.main
findit()
{
if [ $# -lt 1 ] ; then
echo "Usage:findit file"
return 1
fi
find / -name $1 –print
}
ロード機能
- ファイルには、シェルにそれをロードするために、機能に作成された後、
- シェルの機能を見つけて、読み込むファイル形式
- 。ファイル名の或ソースファイル名
- 注:つまり<ポイント> <スペース> <ファイル名>
- ここでは、ファイル名は正しい道を取ります
- 例:
- 上記の例の関数は、次のコマンドを使用することができます
- 。functions.main
ロード機能をチェック
- 機能がロードされているかどうかを確認するには、setコマンドを使用して、ロードされたシェルでコマンドを実行するとはすべての機能を設定します
- 例:
set
findit=( ) {
if [ $# -lt 1 ]; then
echo "usage :findit file"
return 1
fi
find / -name $1 -print
}
…
シェルの機能を実行します
- 機能を実行するには、単に関数の名前を入力することができます
- 例:
findit groups
/usr/bin/groups
/usr/local/backups/groups.bak
シェル関数を削除します。
- 機能は現在、いくつかの変更を加えた後、あなたはシェルに、それが使用できなくなって、機能を削除する必要があります。削除機能を完了するために、unsetコマンドを使用します
- コマンドの形式は次のとおりです。
unset function_name
例:
unset findit
そして、コマンドセットを入力し、機能が表示されなくなります
環境機能:子プロセスも使用することができます
- 免責事項:輸出-f FUNCTION_NAME
- 表示:輸出-fまたは-xf宣言
関数の引数
- 関数がパラメータを受け入れることができます。
- 関数に渡されるパラメータ:関数が呼び出されると、関数名へのパラメータの与えられたスペース区切りのリスト。
- 例えば、 "testfunc ARG1 arg2に..."
- $ 1、$ 2、...呼び出しパラメータを使用することができる機能のボディで、また$ @の$ *の$#やその他の特別な変数を使用することができます
- 関数に渡されるパラメータ:関数が呼び出されると、関数名へのパラメータの与えられたスペース区切りのリスト。
関数の変数
- 変数のスコープ:
- 環境変数:現在のシェルサブシェルと効果
- ローカル変数:効果的なだけで、現在のシェルプロセスでは、スクリプトは、専用のサブシェルプロセスを実装するために開始しますが、スクリプト機能を含む現在のシェル・スクリプト・ファイルのため、ローカル変数のスコープ、
- ローカル変数:ライフサイクル機能、関数、変数の終わりには、自動的に破棄されます
- 注意:関数がローカル変数を持っている場合は、ローカル変数とそれらの名前は、ローカル変数を使用する場合
- 関数法でローカル変数を定義します。
- ローカルNAME = VALUE
再帰関数の例
- 再帰関数:
- この関数は、直接または間接的に自分自身を呼び出します
- 再帰的な層を注意してください
- 再帰の例:
- 1808で階乗演算記号キーストーンカルマン発明は、数学的な用語、正の整数の階乗(階乗)数の積未満と等しいすべての正の整数であり、そして0階乗、自然数でありますnは階乗n個の書き込み!
- N!= 1×2×3×...×n個
- 階乗も再帰的に0 = 1 :!定義、nは=(N-1)×N!
- N!= n(nは-1)(N-2)... 1
- n(nは-1)!= N(N-1)(N-2)!
- 1808で階乗演算記号キーストーンカルマン発明は、数学的な用語、正の整数の階乗(階乗)数の積未満と等しいすべての正の整数であり、そして0階乗、自然数でありますnは階乗n個の書き込み!
- 例:fact.sh
#!/bin/bash
#
fact() {
if [ $1 -eq 0 -o $1 -eq 1 ]; then
echo 1
else
echo $[$1*$(fact $[$1-1])]
fi
}
fact $1
フォーク爆弾
- フォーク爆弾は、その内部には、単純な再帰的なプログラム、本質的には、無限ループフォーク過程で一定であり、悪意のあるプログラムです。システム内でこの簡単な手順の急速な減少につながる可能性は制限、すべてのリソースが存在しない場合、プログラムは、再帰的であるので、
- 達成するための機能
:(){ :|:& };:
bomb() { bomb | bomb & }; bomb
- 達成するためのスクリプト
- 猫Bomb.sh
!/ binに/ bashの
- ./$0|./$0&