腳本規範
腳本代碼開頭約定,如下:
#!/bin/bash
# ------------------------------------------
# Filename: hello.sh
# Revision: 1.1
# Date: 2017/06/01
# Author: zhang
# Email: [email protected]
# Website: www.123456.com
# Description: This is the first script
# ------------------------------------------
# Copyright: 2017 zhang
# License: GPL
echo “hello world”
調試腳本
檢查腳本文法錯誤
bash -n /path/to/some_script
調試執行
bash -x /path/to/some_script
shell裡的變量
- 本地變量:隻對目前shell有效;作用範圍可以是整個shell程式檔案,包括腳本中的函數,對其他的shell無效。
- 環境變量:對目前shell及子程序shell有效。
- 聲明、指派:export name=value 或者 declare -x name=value
- 局部變量:與函數的生命周期一樣;
- 定義:local name=value
- 位置變量:$1,$2,…,表示腳本傳入的第幾個參數
-
特殊變量:$?(上一條指令執行結果代碼),$0(目前腳本名稱),$#(腳本參數個數)
注:在用完變量之後要unset 變量名,這是個好習慣。
退出狀态
程序使用退出狀态來報告指令執行成功或失敗
- 0代表成功,1-255表示失敗,系統通過數字來指定特定的錯誤
- $?儲存最近的退出狀态,用來判斷執行指令是否成功
- 不過我們在腳本裡可以自定義退出狀态碼,用exit [n] 定義
注意:腳本中一旦遇到exit 指令,腳本會立即終止;終止退出狀态取決于exit 指令後面的數字
注意:如果未給腳本指定退出狀态碼,整個腳本的退出狀态碼取決于腳本中執行的最後一條指令的狀态碼
shell裡的算術運算
算術運算符:+,-,*,/,%,** (乘法符号有些場景中需要轉義 ,如*),算術表達式裡的變量可以不加$,以下是實作算術運算并指派的幾種形式
-
let var=算術表達式
注意:let和expr運算符隻要後面表達式執行結果為0,會傳回錯誤代碼1,寫腳本做運算的時候注意!!!
這裡有個特殊例子:let k++ 和 let ++k 前面的傳回1,後面的傳回0
- var=$((算術運算符))
- var=$[算術運算符]
-
var=$(expr arg1 運算符 arg2)
注意:expr數字與運算符之間要有空格,否則會報錯,參數除數字之外要加$
- declare -i var=value 聲明變量val為數值,感覺這個和普通聲明沒有太大差別
- echo `算術表達式` | bc
-
$RANDOM (0-32767)
例:echo $[$RANDOM%50] :0-49
shell裡的邏輯運算
邏輯運算就與(&&)或(||)非(!)
與:
1 與 與 1 = 1
1 與 與 0 = 0
0 與 與 1 = 0
0 與 與 0 = 0
或:
1 或 或 1 = 1
1 或 或 0 = 1
0 或 或 1 = 1
0 或 或 0 = 0
以上相信大家比較熟悉,下面簡單介紹下邏輯短路。
短路與:
第一個為0 ,結果必定為0
第一個為1 ,第二個必須要參與運算
短路或
第一個為1 ,結果必定為1
第一個為0 ,第二個必須要參與運算
shell條件測試
在另一篇部落格已經說了基礎知識,下面簡單說一下要注意的地方
測試指令有3種
test expression
[ expression ]
[[ expression ]]
注意:expression前後必須有空格;值為空或不指派時結果為假,所有要加上引号。
[zhang@centos7 MyShell]$ [ a=b ] #操作法兩邊要加上空格,否則系統認為是整體會一直為真
[zhang@centos7 MyShell]$ echo $?
[zhang@centos7 MyShell]$ [ a = b ] #字元串要寫成"$a",和算術運算不一樣
[zhang@centos7 MyShell]$ echo $?
[zhang@centos7 MyShell]$ [ $a = $b ] #這個雖然可以,以防萬一要加上雙引号,這種情況下面介紹
[zhang@centos7 MyShell]$ echo $?
[ -n “$var” ] 這是正确寫法,下面代碼來說明一下
[zhang@centos7 MyShell]$ echo "$ab" #ab為空
[zhang@centos7 MyShell]$
[zhang@centos7 MyShell]$ [ -n $ab ] && echo true #而ab為空顯示true
true
[zhang@centos7 MyShell]$ [ -n "$ab" ] && echo true #這個是正确結果
[zhang@centos7 MyShell]$
[ 條件1 -a 條件2 ] 和 [[ 條件1 && 條件2 ]] 這裡面的邏輯運算是一樣的,裡面沒有邏輯短路問題,不過後面可以接與或邏輯短路。
數值比較用 -eq,-ne…
字元串比較用 ==,>,<…
字元串比較可以比對正規表達式但是要用[[ “$var” =~ 正規表達式 ]],正規表達式不用加雙引号。
條件測試裡的權限測試是測實際權限而不是文字表面權限,比如root使用者對某些檔案沒有讀寫權限,但是用-r或-w測出root是有讀寫權限的