一 什麼是shell script :node
將OS命令堆積到可執行的文件裏,由上至下的順序執行文本里的OS命令 就是腳本了.
再加上些智能(條件/流控)控制,就變成了智能化腳本了.python
1 爲什麼要有變量sql
程序的運行就是一些列狀態的變值值的變化去表示shell
2 變量命名規則express
以字母或下劃線開頭,剩下的部分能夠是:字母、數字、下劃線.bash
最好遵循下述規範:測試
1.以字母開頭
2.使用中劃線或者下劃線作單詞的鏈接
3.同類型的用數字區分
4.對於文件最好加上拓展名ui
5.見名之意,spa
例如: sql_money.tar.gz,log_age.tar.bz2 code
3 系統變量
set 和 env區別
set:顯示全部變量
env:環境變量
4 變量賦值
如:money = 10
age = 20
echo $money
刪除變量 unset age
5 數據類型
bash中的變量無須聲明,拿來就用.默認的變量都會是字符類型,還能夠有數字類型,普通的腳本,這兩種類型夠用了
算術運算符:
1 加 +
2 減 -
3 乘 *
4 除 /
邏輯運算符:
1 大於 >
2 小於 <
3 等於 ==
4 不等於 !=
5 大於等於 >=
6 小於等於 <=
賦值運算符 :
1 =
2 +=
3 -=
4 *=
5 /=
6 %=
例如: a = 1
a = a + 1 簡寫爲: a += a
其餘的都是同樣的意思
1 測試文件狀態
-d 目錄
-s 文件長度 > 0、非空
-f 正規文件
-w 可寫
-r 可讀
-x 可執行
-L 符號鏈接
-u 文件有 suid 位設置
二、字符串測試
= 兩個字符串相等
!= 兩個字符串不相等
-z 空串
-n 非空串
三、測試數值
-eq 等於
-ne 不等於
-gt 大於
-lt 小於
-ge 大於等於
-le 小於等於
[root@MiWiFi-R3-srv ~]# [ 10000 -gt 250 ] #不要使用大於號小於號等於號等,要使用man test中規定的
四、拓展測試符號 [[ ]] (())
4.1 數字測試符號
# [ 10 < 2 ] # 語法錯誤
-bash: 2: 沒有那個文件或目錄
#
# [[ 2 > 10 ]] # 結果錯誤
# echo $?
0
# [[ 20 > 10 ]] # 正確
# echo $?
0
# (( 10 < 20 ))
# echo $?
0
4.2 字符測試
# [ "aa" = "aa" ]
# echo $?
0
# [[ "aa" = "aa" ]]
# echo $?
0
# (( "aa" = "aa" )) #結果錯誤
# echo $?
1
4.3 混合測試
# [ a = a -a 10 < 20 ]
-bash: 20: 沒有那個文件或目錄
[root@seker ~]# [[ a = a -a 10 < 20 ]]
bash: syntax error in conditional expression
-bash: syntax error near `-a'
[root@seker ~]# [[ a = a && 10 < 20 ]]
[root@seker ~]# echo $?
0
[root@seker ~]# [[ a = a || 10 < 20 ]]
[root@seker ~]# echo $?
0
[root@seker ~]# (( a = a || 10 < 20 ))
[root@seker ~]# echo $?
0
[root@seker ~]# (( a = a && 10 < 20 ))
[root@seker ~]# echo $?
0
[root@seker ~]#
結論:
1.1 比較數字,使用(( ))
其餘測試使用 [[ ]]
包含數字比較的混合測試,使用[[ expr1 && expr2 ]] (( expr1 || expr2 ))
1.2 兩個文件的比較
FILE1 -ef FILE2
測試兩個文件是不是相同的inode
有時爲了找到同一個INODE號的文件 更傾向於使用 find 命令的 -inum 或 --samefile
FILE1 -nt FILE2
FILE1 is newer (modification date) than FILE2
FILE1 -ot FILE2
FILE1 is older than FILE2
1分支結構
#!/bin/bash var='/etc/init.d' #var='/dev/sda' if [ -d $var ] then echo "$var is directory" elif [ -b $var ] then echo "$var is block" elif [ -f $var ] then echo "$var is regular file" else echo 'unknow' fi
if 測試中還能夠執行命令 根據命令的返回值作判斷
# if cd / ;then echo Y ;fi
# if grep -q root /etc/passwd ;then echo Y ;fi
向腳本傳遞參數
#test.sh echo $0 echo $1 echo $2 echo $3 echo ${11} echo '$$' $$ echo '$*' $* echo '$@' $@ echo '$#' $# echo '$?' $? ''' 測試:python test.sh 1 2 3 4 5 6 7 8 9 10 11 輸出結果: ./test.sh 1 2 3 11 $$ 14312 $* 1 2 3 4 5 6 7 8 9 10 11 $@ 1 2 3 4 5 6 7 8 9 10 11 $# 11 $? 0 '''
修改腳本,使其能接收調用者傳來的參數
[root@MiWiFi-R3-srv ~]# cat test_file.sh #!/bin/bash if [ -d $1 ] then echo "$1 is directory" elif [ -b $1 ] then echo "$1 is block" elif [ -f $1 ] then echo "$1 is regular file" else echo 'unknown' fi [root@MiWiFi-R3-srv ~]# ./test_file.sh /etc/passwd /etc/passwd is regular file
只有 一個判斷條件爲單分支
當判斷條件多餘一個時,則爲多分支