天天看點

shell腳本基礎及細節總結

腳本規範

腳本代碼開頭約定,如下:

#!/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裡的變量

  1. 本地變量:隻對目前shell有效;作用範圍可以是整個shell程式檔案,包括腳本中的函數,對其他的shell無效。
  2. 環境變量:對目前shell及子程序shell有效。
  3. 聲明、指派:export name=value 或者 declare -x name=value
  4. 局部變量:與函數的生命周期一樣;
    • 定義:local name=value
  5. 位置變量:$1,$2,…,表示腳本傳入的第幾個參數
  6. 特殊變量:$?(上一條指令執行結果代碼),$0(目前腳本名稱),$#(腳本參數個數)

    注:在用完變量之後要unset 變量名,這是個好習慣。

退出狀态

程序使用退出狀态來報告指令執行成功或失敗

  1. 0代表成功,1-255表示失敗,系統通過數字來指定特定的錯誤
  2. $?儲存最近的退出狀态,用來判斷執行指令是否成功
  3. 不過我們在腳本裡可以自定義退出狀态碼,用exit [n] 定義

    注意:腳本中一旦遇到exit 指令,腳本會立即終止;終止退出狀态取決于exit 指令後面的數字

    注意:如果未給腳本指定退出狀态碼,整個腳本的退出狀态碼取決于腳本中執行的最後一條指令的狀态碼

shell裡的算術運算

算術運算符:+,-,*,/,%,** (乘法符号有些場景中需要轉義 ,如*),算術表達式裡的變量可以不加$,以下是實作算術運算并指派的幾種形式

  1. let var=算術表達式

    注意:let和expr運算符隻要後面表達式執行結果為0,會傳回錯誤代碼1,寫腳本做運算的時候注意!!!

    這裡有個特殊例子:let k++ 和 let ++k 前面的傳回1,後面的傳回0

  2. var=$((算術運算符))
  3. var=$[算術運算符]
  4. var=$(expr arg1 運算符 arg2)

    注意:expr數字與運算符之間要有空格,否則會報錯,參數除數字之外要加$

  5. declare -i var=value 聲明變量val為數值,感覺這個和普通聲明沒有太大差別
  6. echo `算術表達式` | bc
  7. $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是有讀寫權限的