一、shell腳本概述和入門
(1)shell腳本是一個命令行解釋器,它接收應用程序/用戶命令,然后調用操作系統內核

(2)shell腳本的常用執行方式:
第一種:采用bash或sh+腳本的相對路徑或絕對路徑(不用賦予腳本+x執行權限) sh(bash) test.sh
第二種:采用輸入腳本的絕對路徑或相對路徑執行腳本(必須具有可執行權限+x) ./test.sh
注意:第一種執行方法,本質是bash解析器幫你執行腳本,所以腳本本身不需要執行權限。第二種執行方法,本質是腳本需要自己執行,所以需要執行權限。
二、shell中的變量
(1)系統變量:
$HOME(家目錄)、$PWD(當前路徑)、$SHELL(shell環境)、$USER(當前用戶)等
(2)自定義變量:
定義變量:變量=值
撤銷變量:unset 變量
聲明靜態變量:readonly變量,注意:不能unset
(3)特殊變量:
$n:(功能描述:n為數字,$0代表該腳本名稱,$1-$9代表第一到第九個輸入參數,十以上的參數需要用大括號包含,如${10})
$#:(功能描述:獲取所有輸入參數個數,常用於循環)。
$*:(功能描述:這個變量代表命令行中所有的參數,$*把所有的參數看成一個整體)
$@:(功能描述:這個變量也代表命令行中所有的參數,不過$@把每個參數區分對待)
$?:(功能描述:最后一次執行的命令的返回狀態。如果這個變量的值為0,證明上一個命令正確執行;如果這個變量的值為非0(具體是哪個數,由命令自己來決定),則證明上一個命令執行不正確了。)
三、運算符和條件判斷:
(1)運算符常用語法:
$((運算式)) 或 $[運算式]
expr + , - , \*, /, % 加,減,乘,除,取余 注意:expr運算符間要有空格 `expr 1 + 2`
(2)條件判斷基本語法:
[ condition ](注意condition前后要有空格)條件非空即為true,[ abc ]返回true,[] 返回false。
常用判斷條件:
a)兩個整數之間比較
= 字符串比較
-lt 小於(less than) -le 小於等於(less equal)
-eq 等於(equal) -gt 大於(greater than)
-ge 大於等於(greater equal) -ne 不等於(Not equal)
b)按照文件權限進行判斷
-r 有讀的權限(read) -w 有寫的權限(write)
-x 有執行的權限(execute)
c)按照文件類型進行判斷
-f 文件存在並且是一個常規的文件(file)
-e 文件存在(existence) -d 文件存在並是一個目錄(directory)
四、流程控制
(1)if判斷
if [ 條件判斷式 ];then
程序
fi
或者
if [ 條件判斷式 ]
then
程序
fi
注意事項:[ 條件判斷式 ] 中括號和條件判斷式之間必須有空格 if后要有空格
(2)case語句
case $變量名 in
"值1")
如果變量的值等於值1,則執行程序1
;;
"值2")
如果變量的值等於值2,則執行程序2
;;
…省略其他分支…
*)
如果變量的值都不是以上的值,則執行此程序
;;
esac
注意事項:
1) case行尾必須為單詞“in”,每一個模式匹配必須以右括號“)”結束。
2) 雙分號“;;”表示命令序列結束,相當於java中的break。
3) 最后的“*)”表示默認模式,相當於java中的default。
(3)for循環
for (( 初始值;循環控制條件;變量變化 ))
do
程序
done
或
for 變量 in 值1 值2 值3…
do
程序
done
(4)while循環
while [ 條件判斷式 ]
do
程序
done
五、read讀取控制台輸入和函數
(1)read讀取基本語法:
read (選項) (參數)
選項:-p 指定讀取時的提示符; -t 指定讀取值時等待的時間(秒)
參數:指定讀取值的變量名
(2)函數:
a)系統函數:
basename [string / pathname] [suffix] (功能描述:basename命令會刪掉所有的前綴包括最后一個(‘/’)字符,然后將字符串顯示出來。
[root@hadoop1 datas]$ basename /opt/module/datas/if.sh if.sh [root@hadoop1 datas]$ basename /opt/module/datas/if.sh .sh if
dirname 文件絕對路徑 (功能描述:從給定的包含絕對路徑的文件名中去除文件名(非目錄的部分),然后返回剩下的路徑(目錄的部分))
[root@hadoop1 datas]$ dirname /opt/module/datas/if.sh /opt/module/datas
b)自定義函數
[ function ] funname[()]
{
Action;
[return int;]
}
funname
注意:
1>必須在調用函數地方之前,先聲明函數,shell腳本是逐行運行。不會像其它語言一樣先編譯。
2>函數返回值,只能通過$?系統變量獲得,可以顯示加:return返回,如果不加,將以最后一條命令運行結果,作為返回值。return后跟數值n(0-255)
六、shell工具
(1)cut
cut [選項參數] filename 說明:默認分隔符是制表符
選項參數: -f 列號,提取第幾列 -d 分隔符,按照指定分隔符分割列
獲取ip:ifconfig eth0 | grep "inet addr" | cut -d : -f 2 | cut -d " " -f 1 先獲取eth0的網卡,再grep到inet addr該行的數據,再根據“:”分隔獲取第二個參數(192.168.232.102 Bcast),再根據“ ”分割獲取第一個參數即為對應的ip
(2)sed
sed [選項參數] ‘command’ filename
選項參數:-e 直接在指令列模式上進行sed的動作編輯。(一個命令時可省略,多個命令連續操作在每個命令前加上-e)
命令參數:a 新增,a的后面可以接字串,在下一行出現 sed "-3a 111" sed.txt(在sed.txt的第3行后面一行加上111,為單獨一行)
d 刪除 sed "/wo/d" sed.txt(在sed.txt中刪除帶有wo的整行數據) sed "2d" sed.txt(在sed.txt中刪除第2行)
s 查找並替換 sed "s/wo/ni/" sed.txt(在sed.txt中每行第一個出現的wo替換為ni,如果加上g就是全局替換)
(3)awk
awk [選項參數] 'pattern1{action1} pattern2{action2}...' filename
pattern:表示AWK在數據中查找的內容,就是匹配模式(正則)
action:在找到匹配內容時所執行的一系列命令
選項參數:-F 指定輸入文本拆分分隔符
-v 賦值一個用戶定義變量 awk -v i=1 -F: '{print $3+i}' passwd 為passwd中的每一個用戶id+1
awk的內置變量:
FILENAME:文件名
NR:已讀行數
NF:瀏覽記錄的域的個數(切割后列的個數) awk -F: '{print "filename:" FILENAME ", linenumber:" NR ",columns:" NF}' passwd (統計passwd文件名,行號和每行的列數)
(4)sort
sort(選項)(參數)
選項:-n 依照數值的大小排序
-r 降序排列
-t 設置排序時所用的分隔字符
-k 指定需要排序的列
sort -t : -nrk 3 sort.sh (按照“:”分割后的第三列倒序排序。)
