[TOC]
編寫Shell腳本
Shell腳本命令的工作方式分為兩種:交互式和批處理
- 交互式(Interactive):用戶每輸入一條命令就立即執(zhí)行
- 批處理(Batch):由用戶事先編寫好一個完整的Shell腳本潭苞,Shell會一次性執(zhí)行腳本中的諸多的命令
1忽冻、編寫簡單的腳本
如果想查看當(dāng)前所在工作路徑并列出當(dāng)前目錄下所有的文件及屬性信息,實現(xiàn)這個功能的腳本如下:
[root@centos7-01 doc]# vim example.sh
#!/bin/bash
#For Example BY linuxprobe.com
pwd
ls -al
Shell腳本文件的名稱可以任意此疹,但為了避免被誤以為是普通文件僧诚,建議將.sh
后綴加上,以表示是一個腳本文件
在上面的example.sh腳本中出現(xiàn)了三種不同的元素:
-
第一行
#!
:腳本聲明#!
用來告訴系統(tǒng)用哪種 Shell 解釋器來執(zhí)行腳本 -
第二行
#
:注釋信息#
是對腳本功能和某些命令的介紹信息 - 第三蝗碎、第四行 :為可執(zhí)行語句
執(zhí)行腳本有兩種方式:
-
第一種 :執(zhí)行命令
bash example.sh
,即可執(zhí)行腳本 - 第二種 :通過輸入腳本完整路徑的方式執(zhí)行湖笨,但默認(rèn)會因為權(quán)限不足而提示報錯,此時為腳本文件增加執(zhí)行權(quán)限即可
# 示例---路徑執(zhí)行腳本
[root@centos7-01 doc]# ./example.sh
-bash: ./example.sh: 權(quán)限不夠
[root@centos7-01 doc]# chmod u+x example.sh
[root@centos7-01 doc]# ./example.sh
/doc
總用量 8
drwxr-xr-x. 2 root root 44 12月 11 16:37 .
dr-xr-xr-x. 18 root root 235 12月 11 10:17 ..
-rwxr--r--. 1 root root 49 12月 11 16:37 example.sh
-rw-r--r--. 1 root root 56 12月 11 10:22 practice.txt
2蹦骑、接受用戶的參數(shù)
Linux 內(nèi)設(shè)了用于接受參數(shù)的變量慈省,變量之間可以使用空格間隔。
各變量的作用:
-
$0
:對應(yīng)當(dāng)前Shell腳本程序的名稱 -
$#
:對應(yīng)總共有幾個參數(shù) -
$*
:對應(yīng)所有位置參數(shù) -
$?
:對應(yīng)顯示上一次命令的執(zhí)行返回值 -
$1眠菇、$2边败、$3...
:分別對應(yīng)著第 N 個位置的參數(shù)值
# 示例---變量參數(shù)
[root@centos7-01 doc]# vim example.sh
#!/bin/bash
# For Example BY chenchen
echo "當(dāng)前腳本名稱為$0"
echo "總共有$#個參數(shù)袱衷,分別是$*"
echo "第一個參數(shù)為$1,第二個參數(shù)為$2笑窜,...致燥,第5個參數(shù)為$5"
[root@centos7-01 doc]# sh example.sh one two three four five six
當(dāng)前腳本名稱為example.sh
總共有6個參數(shù),分別是one two three four five six
第一個參數(shù)為one怖侦,第二個參數(shù)為two,...谜叹,第5個參數(shù)為five
3匾寝、判斷用戶的參數(shù)
Shell腳本中條件測試語法可以判斷表達(dá)式是否成立,若條件成立則返回數(shù)字0荷腊,否則便返回其他隨機(jī)數(shù)值艳悔,條件測試語法的執(zhí)行格式如下:
測試語句格式:[ 條件表達(dá)式 ]
切記,表達(dá)式兩邊均應(yīng)有一個空格
3.1 條件測試語句劃分---按測試對象分4種
- 文件測試語句
- 邏輯測試語句
- 整數(shù)值比較語句
- 字符串比較語句
3.2 文件測試所用的參數(shù)
-
-d
:測試文件是否為目錄類型 -
-e
:測試文件是否存在 -
-f
:判斷是否為一般文件 -
-r
:測試當(dāng)前用戶是否有權(quán)限讀取 -
-w
:測試檔當(dāng)前用戶是否有權(quán)限寫入 -
-x
:測試當(dāng)前用戶是否有權(quán)限執(zhí)行
3.2.1 測試 $?
用測試語句測試一個文件是否為目錄,然后通過 Shell 解釋器內(nèi)設(shè) $? 變量顯示上一條命令的返回值
[root@study doc]# [ -d /doc ]
[root@study doc]# echo $?
0
[root@study doc]# [ -d /doc/example.sh ]
[root@study doc]# echo $?
1
3.2.2 測試一個文件是否為一般文件
[root@study doc]# [ -f /doc/example.sh ]
[root@study doc]# echo $?0
1
3.3 邏輯語句
3.3.1 邏輯“與”&&
在Shell終端中邏輯“與”的運算符號是&&
女仰,它表示當(dāng)前面的命令執(zhí)行成功后才執(zhí)行后面的命令
[root@study ~]# [ -e /doc/example.sh ] && echo "存在"
存在
3.3.2 邏輯“或”||
等號兩邊必須要有空格猜年,才能進(jìn)行邏輯等于
[root@study ~]# echo $USER
root
[root@study ~]# [ $USER=root ] || echo "user"
[root@study ~]# su - chen
Last login: Wed Dec 12 09:06:43 CST 2018 on pts/0
[chen@study ~]$ [ $USER=root ] || echo "user"
[chen@study ~]$ echo $USER
chen
[chen@study ~]$ [ $USER = root ] || echo "user"
user
3.3.3 邏輯“非”!
它表示把條件測試中的判斷結(jié)果取相反值
[chen@study ~]$ exit
logout
[root@study ~]# [ $USER != root ] || echo "administrator"
administrator
3.3.4 與、或疾忍、非 綜合示例
[root@study ~]# [ $USER != root ] && echo "user" || echo "root"
root
3.4 整數(shù)比較運算符
整數(shù)比較運算符僅對數(shù)字操作乔外,且不能使用等號、大于號一罩、小于號來判斷杨幼。因為等號與賦值命令符沖突,大于號和小于號分別與輸出重定向和輸入重定向命令符沖突聂渊。因此一定要使用規(guī)范的整數(shù)比較運算符進(jìn)行操作差购。
-
-eq
:是否等于 -
-ne
:是否不等于 -
-gt
:是否大于 -
-lt
:是否小于 -
-le
:是否等于或小于 -
-ge
:是否大于或等于
[root@study ~]# [ 10 -gt 10 ]
[root@study ~]# echo $?
1
[root@study ~]# [ 10 -eq 10 ]
[root@study ~]# echo $?
0
示例:使用 free -m
命令查看內(nèi)存使用量情況(單位MB),然后通過 grep Mem:
命令過濾出剩余內(nèi)存量的行汉嗽,使用 awk'{print $4}'
命令只保留第四列欲逃,最后用 FreeMem=`語句`
的方式把語句內(nèi)執(zhí)行結(jié)果復(fù)制給變量
[root@study ~]# free -m
total used free shared buff/cache available
Mem: 488 47 23 0 417 417
Swap: 0 0 0
[root@study ~]# free -m | grep Mem
Mem: 488 47 23 0 417 417
[root@study ~]# free -m | grep Mem: | awk '{print $4}'
23
[root@study ~]# FreeMem=`free -m | grep Mem: | awk '{print $4}'`
[root@study ~]# echo $FreeMem
22
[root@study ~]# [ $FreeMem -lt 1024 ] && echo "Insufficient Memory(內(nèi)存不足)"
Insufficient Memory(內(nèi)存不足)
3.5 常見的字符串比較運算符
-
=
:比較字符串內(nèi)容是否相同 -
!=
:比較字符串內(nèi)容是否不同 -
-z
:判斷字符串內(nèi)容是否為空
示例1:判斷String變量是否為空,進(jìn)而判斷是否定義了這個變量
[root@study ~]# [ -z $String ]
[root@study ~]# echo $?
0
示例2:引入邏輯運算符饼暑,判斷語系LANG
[root@study ~]# echo $LANG
en_US.UTF-8
[root@study ~]# [ $LANG != "zh_CN.UTF-8" ] && echo "Not zh_CN(LANG不是漢語)"
Not zh_CN(LANG不是漢語)