シェルスクリプトのメモ(Linuxのスクリプト)

序文

なぜ、あなたは操作およびメンテナンスを選択するか、またはLinuxシステムでは、特定の興味を持つようにしたい場合は、私たちはどのようにシェルスクリプト、この事ので本当によく知っている必要がありますと思いますか?理由:すなわち
1、重要なの自動管理のための基礎
2、追跡及び管理システムの重要な仕事
3、単純な侵入検知機能
4、単一の連続した命令
5、処理(ほとんどの正規表現処理に基づいて)単純なデータ
6、クロスプラットフォームのサポートと短い学習プロセス(ほぼすべての上記のUnixのようにシェルスクリプトを実行することができ、また、スクリプトエミュレータに関連してもMS Windowsのシリーズを使用することができます)

あなたの最初のシェルを書きます

シェルスクリプトを書いても、以下の点に注意して使用する必要があります。

  1. 命令は、トップダウン、左から右への分析と実行から実行されます。
  2. 発行された命令は、同じように、第4章で言及さ:複数の空白は無視され、コマンドのオプションと引数の間になります。
  3. 空白行も無視され、[Tab]キーは、同様に考えブランクキーブランクを押し込まれます。
  4. 記号(CR)を読み出し、入力すると、行(または列)コマンドの実行を開始しようとします。
  5. あまりにも行の内容かのように、あなたは次の行に拡張するために、「[Enter]を」使用することができます。
  6. 「#」コメントとして使用することができます!#データの裏の増加は、コメントテキストとして扱われますが無視されます!

シェルファイルを実行する方法は?:いくつかの方法では、約によって
直接コマンドが与えられた:shell.shファイルがある(RX)を読み出して実行する権限を有していなければならない。次に
、指示を与えるために使用/home/dmtsai/shell.sh:、1絶対パス
、2相対パス:と仮定作業ディレクトリ/ home / dmtsai /、./shell.sh実行するために使用される
3を、変数"PATH"機能:たとえば、指定されたディレクトリに配置されたパスshell.sh:〜/ binに/
bashのへ実行するためのプログラム:「バッシュshell.sh」や「SHのshell.sh」を通じて実行します

第一个シェル例子:
[dmtsai @研究〜] $ます。mkdirのビン。ビンCD
[dmtsai @研究ビン] $ VIM hello.sh
#!/ binに/ bashの
#Program:
「!Hello World」の#このプログラムのショーあなたのスクリーンインチ
#History:
#2015/7月16日VBirdまずリリース
PATH = / binに:/ sbinにします。/ usr / binにします。/ usr / sbinに:は/ usr / local /ビン:は/ usr / local / sbinに:〜/ binに
輸出PATHの
エコー「Hello Worldのを-e!\ \ n」は
終了0

シェルスクリプトの名前を宣言1.最初のライン#/ binに/ bashが:!使用
私たちが、「に基づいていなければならない、bashのを使用しているので#!/ binに/ bashのはbashにこの文書の文法を使用することを宣言すること」文法!プログラムが実行されるとその後、彼は関連する環境bashの設定ファイルを読み込むことができるようになります(一般的に〜/ .bashrcの非ログインシェルがある)、およびbashの実行私たちは、次の手順を実行できるようにすることができます!これは非常に重要です!

プログラム内容の説明:
彼らは、スクリプト全体「!#」最初の行に加えて、シェルの外に宣言するために使用され、他の#は、「ノート」を使用しています!したがって、上記の手順のうち、次の第二行は、プログラム全体の基本的なデータを説明するために使用されます。一般的には、スクリプトの記述を開発しなければならないことをお勧めします。

  1. コンテンツと機能。
  2. バージョン情報。
  3. 作者と連絡先の詳細;
  4. 作成日。
  5. 歴史のように。これは、将来のプログラムを書き換えて、それをデバッグするのに役立ちます!

3.主要な環境変数を宣言した:
(あなたが出力に関連する情報を使用している場合)を確認してくださいいくつかの重要な環境変数が設定され、PATHとLANGすることを推奨し、最も重要な一つです!このように、あなたは絶対パス、それを記述することなく、いくつかの外部コマンドは、直接発行することができ、このプログラム中に私たちを聞かせすることができます!もっと便利に!

4.プログラムの主要部分は、
メインプログラムに書き込まれます!この例では、その行にそれをエコーたです!

5.結果(定義された戻り値)の実装に通知
し、我々はまた、割り込みにプログラムを終了するには、このコマンドを使用して、システムに値を返すことができます- ?命令実行成功のをかどうか、あなたは観察する$変数を使用することができます。出発スクリプトとシステムへの復帰0を表し、その中で、この例では、使用出口0。

さらに、それを使用することもできる。「chmodの+ AまたはX hello.sh ./hello.sh」スクリプトはこれを実行します!

各スクリプト・ファイル内の良いレコードの先頭に、良い習慣スクリプトの書き込みを開発してください:
;スクリプト機能
スクリプトのバージョン情報、
スクリプトの作者とコンタクト情報、
道の著作権スクリプトの宣言;
履歴(ヒストリー)スクリプトの;
発行に「絶対パス」アプローチを使用して、スクリプトで、より具体的な手順、;
必要な環境変数は事前に宣言され、一連のスクリプトが実行されています。

簡単な例では:
使用するためには、説明書を読んで、スクリプトを作成し、彼は、ユーザーが入力させることができます。1.最初の名前と2.姓、そして最終的に画面上に表示される:「あなたのフルネームは次のとおりです。」内容:
[dmtsaiビン@study] $ VIM showname.sh
#/ binに/ bashの!
#Program:
#USER入力のHis-姓と名の完全なプログラムは、彼の名を表示します。..
#history:
#2015年7月16日VBird最初のリリース
PATH = / binに:/ sbinにします。/ usr / binにします。/ usr / sbinに:は/ usr / local /ビン:は/ usr / local / sbinの:〜/ binに
エクスポートPATH
読む-p "を入力してくださいあなたの最初の名前:" FirstNameと#を入力するプロンプトユーザー
-p読み「を入力してくださいあなたの姓 :」姓#は、入力を促す
エコー-e「\ Nyourのフルネームです :$ {FIRSTNAME} $ {姓}」#の画面によって、結果出力

日付の変更に伴い:日付作成されたファイルの使用
[研究ビン@ dmtsai] $ VIM create_3_filename.sh
#/ binに/ bashの!
#Program:
。#Programは、ユーザーの日付INPUTとコマンドで指定された3つのファイルを作成します
#History:
#2015 / 7月16日VBird最初のリリース
PATH = / binに:/ sbinにします。/ usr / binにします。/ usr / sbinに:は/ usr / local /ビン:は/ usr / local / sbinに:〜/ binに
エクスポートがPATH
#1は、ユーザーをすることができます。この変数fileuserファイル名を入力して、作られた、
エコー-e「によってコマンドが3つのファイルを作成するI 『タッチ』を使用します」#純粋な表示情報が。
「を入力してくださいあなたのファイル名:-p読ん 」fileuserの# プロンプトユーザー入力に
#2。 、任意のユーザは、Enterキーを押しますファイル名の変数機能分析の使用を避けるためにそこに設定されている場合は?
=ファイル名Katexパースエラー: 'EOF'、24位のGOT '#':R&LT ...: - 。 "ファイル名"}#スタートコンフィギュレーションファイル名かどうかを判断する3 ...#(DATE --date = 'メンバー前2日' +%Y%mの%d)は #1 日二日前
日付2 = $(日付--date = ' 1日前' +%Y%mの%dの)# 前日
date3 = $(日付+%Y %mは%d)が#の今日の日付
ファイル1 = f i l e n a m e {ファイル名} コンフィギュレーションファイル名に3行を次の{#} DATE1
FILE2 = f i l e n a m e {ファイル名} {DATE2}
FILE3 = f i l e n a m e {ファイル名} {} date3
#。4.ファイル名は、それを作成しました!
タッチ"Katexパースエラー: 'EOF'、10 AT GOT '#'の位置:{FILE1}" #ファイル作成に以下の3行を... touc{} FILE2 "
タッチ" $ {ファイル3} "

数值运算:简单的加减乘除
[dmtsai @研究ビン] $ VIM multiplying.sh
#/ binに/ bashの!
#Program:
#USERは2つの整数を入力。プログラムは、これら2つの数値を横切ることになります。
#History:
#2015/7月16日VBirdまずリリース
PATH = / binに:/ sbinにします。/ usr / binにします。/ usr / sbinに:は/ usr / local /ビン:は/ usr / local / sbinに:〜/ binに
輸出PATHの
エコー「あなたSHOULD入力2つの番号を-e、私はそれらを乗算します!\ n」は
最初の数-p読み取り":" firstnu
秒数-p読み取り":" secnu
合計= $を(( f i r s t n u {firstnu} * {secnu}))
エコー-e「\ nの結果$の{firstnuは} $をxは{secnuは} ==> $ {合計}です」

数值运算:通过BC计算パイ
[dmtsai @研究ビン] $ VIM cal_pi.sh
#!/ binに/ bashの
#Program:
#USER入力計算のパイの数にスケールの数。
#History:
#2015/7月16日VBirdまずリリース
PATH = / binに:/ sbinにします。/ usr / binにします。/ usr / sbinに:は/ usr / local /ビン:は/ usr / local / sbinに:〜/ binに
輸出PATHの
エコー-eは、「このプログラムは、PI値を計算します。\ n」は
エコー-e 『あなたは計算PI値に入力浮動小数点数をすべき\ n』は。
スケール番号(10〜10000)-p読む""チェック?
NUM = KaTeXパースエラー: 'EOF'、「#を得ました'位置18における... hecking: - "10"}#开始判断有否有输入数值EC ... {NUM}。4 *(1)」| BC -L-Q

違いの実装は、スクリプトをシェル(ソース、shスクリプト、./script)

スクリプトが実行されると、直接実行を使用して、このような実装の使用は、実際には、スクリプトは、サブルーチンのbash内で実行されます!サブルーチンが終了すると、サブプログラム内の変数または操作が親プログラムにバックせずに終了します

親プログラムで実行します。スクリプトを実行するためのソースを使用しました

式を用いて決定

テスト命令テスト機能を使用します
ここに画像を挿入説明
ここに画像を挿入説明

私たちが判断し、ユーザーがファイル名を入力して判断してみましょう:

  1. 与えられた場合、ファイルが存在する場合、メッセージ、および割り込みルーチンの「ファイル名が存在しません」。
  2. このファイルが存在する場合、それは彼がファイルまたはディレクトリであると判断され、結果の出力は「ファイル名がディレクトリである」「ファイル名は、通常のファイルです」か
  3. ファイルやディレクトリの執行権限アイデンティティがによって所有されているもの、を決定し、及びデータ出力許可!
    このスクリプトを実行した後、彼はあなたがああを入力したファイル名に基づいてチェックされます!かどうかが、ファイルまたはディレクトリの種類について見て、最終的な判断権限を見てください。

[dmtsai@study bin]$ vim file_perm.sh
#!/bin/bash
#Program:
#User input a filename, program will check the flowing:
#1. ) exist? 2. ) file/directory? 3. ) file permissions
#History:
#2015/07/16 VBird First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
#1. 让使用者输入文件名,并且判断使用者是否真的有输入字串?
echo -e “Please input a filename, I will check the filename’s type and permission. \n\n”
read -p “Input a filename : " filename
test -z ${filename} && echo “You MUST input a filename.” && exit 0
#2. 判断文件是否存在?若不存在则显示讯息并结束脚本
test ! -e KaTeX parse error: Expected 'EOF', got '&' at position 12: {filename} &̲& echo "The fil…{filename}’ DO NOT exist” && exit 0
#3. 开始判断文件类型与属性
test -f ${filename} && filetype=“regulare file”
test -d ${filename} && filetype=“directory”
test -r ${filename} && perm=“readable”
test -w KaTeX parse error: Expected 'EOF', got '&' at position 12: {filename} &̲& perm="{perm} writable"
test -x KaTeX parse error: Expected 'EOF', got '&' at position 12: {filename} &̲& perm="{perm} executable"
#4. 开始输出信息!
echo “The filename: ${filename} is a ${filetype}”
echo “And the permissions for you are : ${perm}”

利用判断符号 [ ]

如果要知道 H O M E [ d m t s a i @ s t u d y   ] {HOME} 这个变量是否为空的,可以这样做: [dmtsai@study ~] [ -z “${HOME}” ] ; echo $?

如果要在 bash 的语法当中使用中括号作为 shell 的判断式时,必须要注意中括号的两端需要有空白字符来分隔喔! 假设我空白键使用 “□” 符号来表示,那么,在这些地方你都需要有
空白键:
[ “ H O M E " = = " HOME" == " MAIL” ]
[□" H O M E " = = " HOME"□==□" MAIL"□]
↑ ↑ ↑ ↑

使用中括号的判断来做一个小案例好了,案例设置如下:

  1. 当执行一个程序的时候,这个程序会让使用者选择 Y 或 N ,
  2. 如果使用者输入 Y 或 y 时,就显示 “ OK, continue ”
  3. 如果使用者输入 n 或 N 时,就显示 “ Oh, interrupt ! ”

如果不是 Y/y/N/n 之内的其他字符,就显示 “ I don’t know what your choice is ”
利用中括号、 && 与 || 来继续吧!
[dmtsai@study bin]$ vim ans_yn.sh
#!/bin/bash
#Program:
#This program shows the user’s choice
#History:
#2015/07/16 VBird First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
read -p "Please input ( Y/N ) : " yn
[ “ y n " = = " Y " o " {yn}" == "Y" -o " {yn}” == “y” ] && echo “OK, continue” && exit 0
[ “ y n " = = " N " o " {yn}" == "N" -o " {yn}” == “n” ] && echo “Oh, interrupt!” && exit 0
echo “I don’t know what your choice is” && exit 0

shell script 的默认变量( $0, $1… )

如果通过指令后面接参数, 那么一个指令就能够处理完毕而
不需要手动再次输入一些变量行为!这样下达指令会比较简单方便啦!
script 是怎么达成这个功能的呢?其实 script 针对参数已经有设置好一些变量名称了!对应如下:
/path/to/scriptname opt1 opt2 opt3 opt4
$0 $1 $2 $3 $4
执行的脚本文件名为 $0 这个变量,第一个接的参数就是 $1 啊~ 所以,只要我们在 script 里面善用 $1 的话,就可以很简单的立即下达某些指令功能了!除了这些数字的变量之外, 我们还有一些较为特殊的变量可以在 script 内使用来调用这些参数!
$# :代表后接的参数 “ 个数 ” ,以上表为例这里显示为 “ 4 ” ;
$@ :代表 “ “$1” “$2” “$3” “$4” ” 之意,每个变量是独立的(用双引号括起来);
$* :代表 “ “$1c$2c$3c$4” ” ,其中 c 为分隔字符,默认为空白键, 所以本例中代表 “ “$1 $2 $3 $4” ” 之意。

执行一个可以携带参数的 script ,执行该脚本后屏幕会显示如下的数据:
程序的文件名为何?
共有几个参数?
若参数的个数小于 2 则告知使用者参数数量太少
全部的参数内容为何?
第一个参数为何?
第二个参数为何?

[dmtsai@study bin]$ vim how_paras.sh
#!/bin/bash
#Program:
#Program shows the script name, parameters…
#History:
#2015/07/16 VBird First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo “The script name is ==> ${0}”
echo “Total parameter number is ==> KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲" [ "#” -lt 2 ] && echo “The number of parameter is less than 2. Stop here.” && exit 0
echo “Your whole parameter is ==> ‘$@’”
echo “The 1st parameter ==> ${1}”
echo “The 2nd parameter ==> ${2}”

执行结果如下:
[dmtsai@study bin]$ sh how_paras.sh theone haha quot
The script name is ==> how_paras.sh <==文件名
Total parameter number is ==> 3 <==果然有三个参数
Your whole parameter is ==> ‘theone haha quot’ <==参数的内容全部
The 1st parameter ==> theone <==第一个参数
The 2nd parameter ==> haha <==第二个参数

shift :造成参数变量号码偏移

我们将 how_paras.sh 的内容稍作变化一下,用来显示每次偏移后参数的变化情况:
[dmtsai@study bin]$ vim shift_paras.sh
#!/bin/bash
#Program:
#Program shows the effect of shift function.
#History:
#2009/02/17 VBird First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo “Total parameter number is ==> KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲" echo "Your wh…@’”
shift # 进行第一次“一个变量的 shift ”
echo “Total parameter number is ==> KaTeX parse error: Expected 'EOF', got '#' at position 1: #̲" echo "Your wh…@’”
shift 3 # 进行第二次“三个变量的 shift ”
echo “Total parameter number is ==> KaTeXパースエラー: 'EOF'は、1位の'#'を得た:# "エコー"あなたのWH ... @ '」

次のように実行結果は以下のとおりです。
4 5 6スリーワンTWOで$ SHのshift_paras.sh [研究ビン@ dmtsai] <6つのパラメータが与えられた==
総パラメータ数れる==> 6 < == 最も原始的なパラメータの変数の状況
あなたの全体のパラメータがあります= =>「1 2 3 4 5 6」
総数パラメータが==>である。5 <==第1シフトは、最初のものが欠落している参照するには、以下の発見
あなたの全体のパラメータをある==>「2 3 4 5 6」
総パラメータ数がある==> 2 < == 第2の3 4 2が欠落している、3からオフセット
あなたの全体のパラメータをある==>「5 6」

エピローグ

これらの基本的な操作の使用が条件の下でこれらのステートメントを使用します記事に続いて、シェルです。

公開された19元の記事 ウォンの賞賛0 ビュー1399

おすすめ

転載: blog.csdn.net/qq_22356995/article/details/104209650