1.介紹
shell是一種腳本語言 aming_linux blog.lishiming.net
可使用邏輯判斷、循環等語法
能夠自定義函數
shell是系統命令的集合
shell腳本能夠實現自動化運維,能大大增長運維效率
2.腳本結構和執行
開頭須要加#!/bin/bash
以#開頭的行做爲解釋說明
腳本的名字以.sh結尾,用於區分這是一個shell腳本
執行方法有兩種
chmod +x 1.sh; ./1.sh
bash 1.sh
查看腳本執行過程 bash -x 1.sh
查看腳本是否語法錯誤 bash -n 1.sh
3.date命令
date +%Y-%m-%d, date +%F 年月日
date +%H:%M:%S = date +%T 時間
date +%s 時間戳(距離1970.01.01時間)
date +%s -d "2018-05-07 10:43:00" 根據特定時間算時間戳
date -d @1504620492 根據時間戳反推時間
date -d "+1day" 一天後
date -d "-1 day" 一天前
date -d "-1 month" 一月前
date -d "-1 min" 一分鐘前
date +%w 星期幾(數字)
date +%W 今年第幾周
date +%Y 年(四位)
date +%y 年(兩位)
date +%D 斜線分割的年月日
date +%h 英文的月份(前三個字母)
cal 顯示日曆(顯示一個月)
4.變量
當腳本中使用某個字符串較頻繁而且字符串長度很長時就應該使用變量代替
使用條件語句時,常使用變量 if [ $a -gt 1 ]; then ... ; fi
引用某個命令的結果時,用變量替代 n=wc -l 1.txt
寫和用戶交互的腳本時,變量也是必不可少的 read -p "Input a number: " n; echo $n 若是沒寫這個n,能夠直接使用$REPLY
內置變量 $0, $1, $2… $0表示腳本自己,$1 第一個參數,$2 第二個 .... $#表示參數個數
數學運算a=1;b=2; c=$(($a+$b))或者$[$a+$b]
5.邏輯判斷
格式1:if 條件 ; then 語句; fi
格式2:if 條件; then 語句; else 語句; fi
格式3:if …; then … ;elif …; then …; else …; fi
邏輯判斷表達式:if [ $a -gt $b ]; if [ $a -lt 5 ]; if [ $b -eq 10 ]等 -gt (>); -lt(<); -ge(>=); -le(<=);-eq(==); -ne(!=) 注意處處都是空格
可使用 && || 結合多個條件
if [ $a -gt 5 ] && [ $a -lt 10 ]; then
if [ $b -gt 5 ] || [ $b -lt 3 ]; then
注意:&&和||用在命令間和條件判斷之間的效果有差別,這裏只是單純的「與」 「或」的並列關係linux
#!/bin/bash #if語句 a=1 if [ $a == 2 ] then echo "true" else echo "false" fi
6.if-判斷文件屬性
[ -f file ]判斷是不是普通文件,且存在
[ -d file ] 判斷是不是目錄,且存在
[ -e file ] 判斷文件或目錄是否存在
[ -r file ] 判斷文件是否可讀
[ -w file ] 判斷文件是否可寫
[ -x file ] 判斷文件是否可執行shell
7.if特殊用法
if [ -z $a ] 這個表示當變量a的值爲空時會怎麼樣
if [ -n "$a" ] 表示當變量a的值不爲空(也可判斷文件,此時不須要加引號)
if grep -q '123' 1.txt; then 表示若是1.txt中含有'123'的行時會怎麼樣
if [ ! -e file ]; then 表示文件不存在時會怎麼樣
if (($a\<1)); then …等同於 if [ $a -lt 1 ]; then… 數組
[ ] 中不能使用<,>,==,!=,>=,<=這樣的符號bash
8.case
格式 case 變量名 in
value1)
command
;;
value2)
command
;;
*)
commond
;;
esac
在case程序中,能夠在條件中使用|,表示或的意思, 好比
2|3)
command
;;運維
#!/bin/bash/ #判斷奇偶 read -p "please input a number:" n n1=`echo $n |sed 's/[0-9]//g'` if [ ! -z $n1 ] then echo "Please input a number." exit 1 fi n2=$[$n%2] case $n2 in 0) echo "even" ;; 1) echo "odd" ;; esac
9.for循環
語法:for 變量名 in 條件; do …; done
求和ide
#!/bin/bash sum=0 for i in `seq 1 100` do sum=$[$sum+$i] echo $i done echo $sum
文件列表循環函數
#!/bin/bash cd /etc/ for a in `ls /etc/` do if [ -d $a ] then ls -d $a fi done
當文件名中有空格,for循環會將其分隔開做爲不一樣元素.net
10.while循環
語法 while 條件; do … ; done
監控系統負載並郵件code
#!/bin/bash while : do load=`w|head -1|awk -F 'load average: ' '{print $2}'|cut -d. -f1` if [ $load -gt 10 ] then mail -s "load is high: $load" asldkfls@11.com fi sleep 30 done
11.continue, break, exit
continue 跳出本次循環,直接進入下一次循環
break 跳出整個循環,進入腳本的下一個步驟
exit 跳出整個腳本blog
12.函數
函數就是把一段代碼整理到了一個小單元中,並給這個小單元起一個名字,當用到這段代碼時直接調用這個小單元的名字便可。
格式:
function f_name() {
command
}
函數必需要放在最前面,先定義函數以後才能調用之
示例1
[root@slx-01 learn]# cat input_fun.sh #!/bin/bash function input() { echo $1 $2 $3 $0 $# } input 1 a b [root@slx-01 learn]# sh input_fun.sh 1 a b input_fun.sh 3
sh後輸出的結果分別爲三個輸入的參數,bash名,參數總數
若要求從外部輸入參數,能夠作以下更改
[root@slx-01 learn]# cat input_fun.sh #!/bin/bash function input() { echo $1 $2 $3 $0 $# } input $1 $2 $3 [root@slx-01 learn]# sh input_fun.sh n b 5 n b 5 input_fun.sh 3
示例2(求兩參數的和)
[root@slx-01 learn]# cat sum_fun.sh #!/bin/bash sum() { s=$[$1+$2] echo $s } sum 1 2 [root@slx-01 learn]# sh sum_fun.sh 3
示例3(輸入網卡名,顯示對應ip)
#!/bin/bash ip() { ifconfig |grep -A1 "$1: " |tail -1 |awk '{print $2}' } read -p "Please input the eth name: " e myip=`ip $e` echo "$e address is $myip"
grep後的參數除了輸入的參數(即網卡名)外,還緊跟冒號的空格,是爲了不引入其餘網卡(如ens33:1)
13.數組
定義數組 a=(1 2 3 4 5)
echo ${#a[@]} 獲取數組的元素個數
echo ${a[2]} 讀取第三個元素,數組從0開始
echo ${a[*]} 等同於 ${a[@]} 顯示整個數組
數組賦值
a[1]=100
a[5]=2 若是下標不存在則會自動添加一個元素,增長一個,不會隔空增長
數組的刪除
unset a; unset a[1]
數組分片
a=(seq 1 5
)echo ${a[@]:0:3} 從第一個元素開始,截取3個echo ${a[@]:1:4} 從第二個元素開始,截取4個echo ${a[@]:0-3:2} 從倒數第3個元素開始(也是從前日後),截取2個數組替換echo ${a[@]/3/100} 把第四個換成100而且echo所有a=(${a[@]/3/100}) 只是替換,不echo