shell是用戶與內核進行交互操做的一種接口,目前最流行的shell稱爲bash shell,bashshell編程以其簡潔、高效而著稱,多年來成爲linux程序員和系統管理員解決實際問題的利器。linux
bash編程是面向過程的,依靠bash解釋器邊解釋邊執行,腳本的編寫格式:程序員
第一行:寫明解釋器; #!/bin/bashshell
註釋行:全部以#開頭的行均爲註釋行;會被解釋器忽略編程
下面來看一個經典的小程序:小程序
#!/bin/bash數組
echo "hello world"bash
它的第一行表示這個腳本程序由/bin/bash來解釋.第二行在終端上打印出一行」Hello World」ide
1、給腳本傳參數函數
bash腳本咱們還能夠給它傳遞參數,在腳本里經過調用位置變量來實現測試
#!/bin/bash
echo $* #$*表示全部參數列表
echo $@ #$@表示全部參數列表
echo $0 #$0是指腳本名稱
echo $1 #$1表示腳本的第1個位置參數
echo $# #$# 表示當前腳本的位置參數個數
2、條件測試
條件測試: test 表達式
[表達式 ]
[[表達式 ]]
測試表達式:
(1) 整數測試: 整數測試:A, B
A -gt B: 大於
A -ge B: 大於等於
A -eq B: 等於
A -lt B: 小於
A -le B: 小於等於
A -ne B: 不等於
(2) 字符串測試: 字符串測試:A, B
A > B
A < B
A >= B
A <= B
A == B或A =B:等值比較
A != B: 不等於
-z A: 判斷A是否爲空;空則爲真,不空則假
-n A:判斷A是否不空;不空則爲值,空則爲假
(3) 文件測試: -e$file: 是否存在;存在則爲真
-f $file: 文件是否存在,且爲普通文件
-d $file: 是否存在且爲目錄
-h $file: 是否存在且爲符號連接文件
-L $file:同上
-b $file: 是否存在且爲塊設備文件
-c $file: 是否存在且爲字符設備文件
-S $file: 是否存在且爲套接字文件
-p $file: 是否存在且爲管道文件
-r$file: 當前用戶對此文件是否擁有讀權限
-w $file: 當前用戶對此文件是否擁有寫權限
-x $file: 當前用戶對此文件是否擁有執行權限
-u$file: 文件是否擁有suid權限
-g $file:文件是否擁有sgid權限
-k $file: 文件是否擁有sticky權限
-O$file: 當前用戶是否爲文件的屬主
-G $file: 當前用戶是否屬於文件的屬組
-N $file:文件自從上一次被讀取以後,是否被修改過
$f1 -nt$f2: 文件f1是否比文件f2新
$f1 -ot $f2: 文件f1是否比文件f2舊
$f1 -ef $f2:f1和f2是否爲同一個文件的硬連接
3、流程控制
1、for循環
for 變量 in列表; do
循環體
done
如咱們要打印1到10,咱們能夠這樣寫
#!/bin/bash
for i in {1..10};do
echo "$i"
done
2、if條件判斷
if 條件;then
條件爲真時執行命令
else
條件爲假時執行命令
fi
例如:
#!/bin/bash
if [ 5 -eq 4 ];then
echo "true"
else
echo "false"
fi
3、case條件判斷,一般用於判斷字符串
case 變量 in
值1)
變量值等於值1執行語句
;;
值2)
變量值等於值2執行語句
;;
*)
變量值等於其餘值執行語句
;;
esac
例如:
#!/bin/bash
case $1 in
cpu)
lscpu ;;
*)
exit 0 ;;
esac
4、while和until循環
whileCONDITION; do
循環體
循環控制變量的修正表達式
done
untilCONDITION; do
循環體
循環控制變量修正表達式
done
例如
#!/bin/bash
declare -i i=1
while [ $i -le 10 ];do
echo $i
let i++
done
5、循環控制命令break和continue
break:提早退出循環;
break [N]: 退出N層循環;N省略時表示退出break語句所在的循環;
continue: 提早結束本輪循環,而直接進入下輪循環;
continue [N]:提早第N層的循環的本輪循環,而直接進入下輪循環;
4、函數
定義函數的目的:將有特定功能的代碼塊,定義一個函數名稱,在要使用此代碼塊時,直接調用函數,而不用再寫一遍此代碼塊,也能夠給函數傳遞參數
function_name(){
函數代碼塊
}
例如
#!/bin/bash
testfuc() {
echo "test function"
}
testfuc #調用函數testfuc
函數的返回值:
函數中使用打印語句:echo, printf
函數體中OS命令執行結果的輸出
函數的退出狀態碼:
默認取決於函數體執行的最後一個命令的退出狀態碼;
自定義退出狀態碼:return [0-255]
注意:函數體運行時,一旦遇到return語句,函數即返回;
5、數組
數組元素:數組名+索引
索引:從0開始編號
聲明數組:declare -a ARRAR_NAME
關聯數組:declare -A ARRAY_NAME
數組元素的賦值:
(1) 一次只賦值一個元素
ARRAY[index]=VALUE
a[0]="hello"
(2) 一次賦值所有元素
ARRAY=("mon""tue" "wed")
(3) 指定索引進行賦值
ARRAY=([0]="sun"[1]="mon" [5]="fri")
(4) read -a ARRAY
引用數組元素:${ARRAY[index]}
數組的長度: ${#ARRAY[*]}, ${#ARRAY[@]}
例如
#!/bin/bash
declare -a testarry
for i in {0..9};do
testarry[$i]=$RANDOM
done
echo "${testarry[*]}"
6、字符串操做
字符串切片:${var:offset:lenth}
取字符串最後的幾個字符:${var: -lenth} 注意:冒號以後有空格
基於模式取子串:
${var#*word}:其中word能夠是指定的任意字符;自左而右,查找var變量所存儲字符中,第一次出現的word,刪除字符開頭直至第一次wrod出現處之間的全部字符
${var##*word}: 其中word能夠是指定的任意字符;自左而右,查找var變量所存儲字符中,最後一次出現的word,刪除字符開頭直至最後一次wrod出現處之間的全部字符
${var%word*}:自右而左,刪除第一次word出現處的字符開始直到尾部的全部字符
${var%%word*}:自右而左,刪除最後一次word出現處的字符開始直到尾部的全部字符
例如 : url=http://www.magedu.com:80
取端口:${url##*:}
取協議:${url%%:*}
查找並替換:
${var/pattern/substi}:查找var所表示的字串中,第一次被Pattern匹配到的字串,並以substi替換之
${var//patten/substi}:查找var所表示的字串中,全部被Pattern匹配到的字串,並以substi替換之
${var/#pattern/substi}:以行首錨定的方式將pattern匹配至var所表示的字串上,若是能匹配,則以substi替換之
${var/%pattern/substi}:以行尾錨定的方式將pattern匹配至var所表示的字串上,若是能匹配,則以substi替換之;可以使用?, *元字符
查找並刪除:
${var/pattern}:刪除pattern匹配到的第一次出現;
${var//pattern}:刪除pattern匹配到的全部出現;
${var/#pattern}
${var/%pattern}
字符串大小寫轉換:
${var^^}:小寫-->大寫
${var,,}:大寫-->小寫
變量賦值:
${var:-word}:若是var爲空或未設置,那麼返回word;不然,則返回var中的值;
${var:=word}:若是var爲空或未設置,那麼返回word,而且將word賦值給var;不然,返回var中的值;
${var:?err_info}:若是var爲空或未設置,那麼返回錯誤信息;不然,則返回var自身的值;
${var:+word}:若是var自身有正常數據,則返回word;