Linux Shell腳本學習 筆記整理

指定腳本解釋器

#!/bin/bash


注意:
1、該聲明只能放在腳本的首行,說明該腳本使用bash解釋器來解釋執行,否則會被當成註釋
2、bash必須使用絕對路徑
3、該聲明只在腳本作爲可執行程序,通過./test.sh調用是纔有效,如果通過sh test.sh 則會直接運行sh解釋器 test.sh只是作爲參數傳遞而已

調試腳本

通過參數-x來調試腳本 
sh -x test.sh

這將執行該腳本並顯示所有變量的值。 
shell還有一個不需要執行腳本只是檢查語法的模式。可以這樣使用: 
sh -n test,sh

這將返回所有語法錯誤

shell變量


1、readonly設置只讀變量
#!/bin/bash

name="Jack"
readonly name
name="Jams"
readonly修飾後,name的值不能再改變,否則執行會報錯:
name: readonly variable

2、unset 刪除變量
相當於將變量置爲空,unset不可以刪除只讀變量

3、變量類型
運行shell時,會同時存在三種變量:
1) 局部變量 局部變量在腳本或命令中定義,僅在當前shell實例中有效,其他shell啓動的程序不能訪問局部變量。
2) 環境變量 所有的程序,包括shell啓動的程序,都能訪問環境變量,有些程序需要環境變量來保證其正常運行。必要的時候shell腳本也可以定義環境變量。
3) shell變量 shell變量是由shell程序設置的特殊變量。shell變量中有一部分是環境變量,有一部分是局部變量,這些變量保證了shell的正常運行

4、特殊變量
$0 當前腳本的文件名
$n 傳遞給腳本或函數的參數。n 是一個數字,表示第幾個參數。例如,第一個參數是$1,第二個參數是$2。
$# 傳遞給腳本或函數的參數個數。
$* 傳遞給腳本或函數的所有參數。
$@ 傳遞給腳本或函數的所有參數。
$? 上個命令的退出狀態,或函數的返回值。
$$ 當前Shell進程ID。對於 Shell 腳本,就是這些腳本所在的進程ID。


$* 和 $@ 都表示傳遞給函數或腳本的所有參數,不被雙引號(" ")包含時,都以"$1" "$2" … "$n" 的形式輸出所有參數。
但是當它們被雙引號(" ")包含時,
"$*" 會將所有的參數作爲一個整體,以"$1 $2 … $n"的形式輸出所有參數;
"$@" 會將各個參數分開,以"$1" "$2" … "$n" 的形式輸出所有參數。


單引號與雙引號

單引號用於保持引號內所有字符的字面值,即使引號內的\和回車也不例外,但是字符串中不能再出現單引號
雙引號用於保持引號內所有字符的字面值(回車也不例外),但以下情況除外
$加變量名可以取變量的值
反引號仍表示命令替換
\$表示$的字面值
\`表示`的字面值
\"表示"的字面值
\\表示\的字面值
除以上情況之外,在其它字符前面的\無特殊含義,只表示字面值。

算數運算


下表列出了常用的算術運算符,假定變量 a 爲 10,變量 b 爲 20:

運算符 說明 舉例
+ 加法 `expr $a + $b` 結果爲 30。
- 減法 `expr $a - $b` 結果爲 -10。
* 乘法 `expr $a \* $b` 結果爲  200。
/ 除法 `expr $b / $a` 結果爲 2。
% 取餘 `expr $b % $a` 結果爲 0。
= 賦值 a=$b 將把變量 b 的值賦給 a。

表達式和運算符之間要有空格,例如 2+2 是不對的,必須寫成 2 + 2,這與我們熟悉的大多數編程語言不一樣。
完整的表達式要被 ` ` 包含,注意這個字符不是常用的單引號,在 Esc 鍵下邊。
乘法符號需要轉義

除了expr,還可以用(())來表示,例如:var=$(( 20 + 5 ))


數字的關係運算符


關係運算符只支持數字,不支持字符串,除非字符串的值是數字。

下表列出了常用的關係運算符,假定變量 a 爲 10,變量 b 爲 20:

運算符 說明 舉例
-eq 檢測兩個數是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。
-ne 檢測兩個數是否相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
-gt 檢測左邊的數是否大於右邊的,如果是,則返回 true。 [ $a -gt $b ] 返回 false。
-lt 檢測左邊的數是否小於右邊的,如果是,則返回 true。 [ $a -lt $b ] 返回 true。
-ge 檢測左邊的數是否大於等於右邊的,如果是,則返回 true。 [ $a -ge $b ] 返回 false。
-le 檢測左邊的數是否小於等於右邊的,如果是,則返回 true。 [ $a -le $b ] 返回 true。


布爾/邏輯運算


下表列出了常用的布爾運算符,假定變量 a 爲 10,變量 b 爲 20:

運算符 說明 舉例
! 非運算,表達式爲 true 則返回 false,否則返回 true。 [ ! false ] 返回 true。
-o 或運算,有一個表達式爲 true 則返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a 與運算,兩個表達式都爲 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。

以下介紹 Shell 的邏輯運算符(注意用了雙中括號),假定變量 a 爲 10,變量 b 爲 20:

運算符 說明 舉例
&& 邏輯的 AND [[ $a -lt 100 && $b -gt 100 ]] 返回 false
|| 邏輯的 OR [[ $a -lt 100 || $b -gt 100 ]] 返回 true

字符串運算符


下表列出了常用的字符串運算符,假定變量 a 爲 "abc",變量 b 爲 "efg":

運算符 說明 舉例
= 檢測兩個字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
!= 檢測兩個字符串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。
-z 檢測字符串長度是否爲0,爲0返回 true。 [ -z $a ] 返回 false。
-n 檢測字符串長度是否爲0,不爲0返回 true。 [ -n $a ] 返回 true。
str 檢測字符串是否爲空,不爲空返回 true。 [ $a ] 返回 true。

字符串比較的> < 要轉義,否則會被當作重定向符號

字符串處理


取長度
str="abcd"
expr length $str   # 4
echo ${#str}       # 4

查找子串的位置
str="abc"
expr index $str "a"  # 1
expr index $str "b"  # 2
expr index $str "x"  # 0
expr index $str ""   # 0

截取子串
str="abcdef"
expr substr "$str" 1 3  # 從第一個位置開始取3個字符, abc
expr substr "$str" 2 5  # 從第二個位置開始取5個字符, bcdef 
expr substr "$str" 4 5  # 從第四個位置開始取5個字符, def

echo ${str:2}           # 從第二個位置開始提取字符串, bcdef
echo ${str:2:3}         # 從第二個位置開始提取3個字符, bcd
echo ${str:(-6):5}        # 從倒數第二個位置向左提取字符串, abcde
echo ${str:(-4):3}      # 從倒數第二個位置向左提取6個字符, cde

str="abbc,def,ghi,abcjkl"
echo ${str#a*c}     # 輸出,def,ghi,abcjkl  一個井號(#) 表示從左邊截取掉最短的匹配 (這裏把abbc字串去掉)
echo ${str##a*c}    # 輸出jkl,             兩個井號(##) 表示從左邊截取掉最長的匹配 (這裏把abbc,def,ghi,abc字串去掉)
echo ${str#"a*c"}   # 輸出abbc,def,ghi,abcjkl 因爲str中沒有"a*c"子串
echo ${str##"a*c"}  # 輸出abbc,def,ghi,abcjkl 同理
echo ${str#*a*c*}   # 空
echo ${str##*a*c*}  # 空
echo ${str#d*f)     # 輸出abbc,def,ghi,abcjkl, 
echo ${str#*d*f}    # 輸出,ghi,abcjkl   
 
echo ${str%a*l}     # abbc,def,ghi  一個百分號(%)表示從右邊截取最短的匹配 
echo ${str%%b*l}    # a             兩個百分號表示(%%)表示從右邊截取最長的匹配
echo ${str%a*c}     # abbc,def,ghi,abcjkl

字符串替換
str="apple, tree, apple tree"
echo ${str/apple/APPLE}   # 替換第一次出現的apple
echo ${str//apple/APPLE}  # 替換所有apple
 
echo ${str/#apple/APPLE}  # 如果字符串str以apple開頭,則用APPLE替換它
echo ${str/%apple/APPLE}  # 如果字符串str以apple結尾,則用APPLE替換它

大小寫轉換
##轉爲大寫
echo $PATH | tr '[a-z]' '[A-Z]'
##轉爲小寫
echo $PATH | tr '[A-Z]' '[a-z]'

文件測試運算符


文件測試運算符用於檢測 Unix 文件的各種屬性。

屬性檢測描述如下:

操作符 說明 舉例
-b file 檢測文件是否是塊設備文件,如果是,則返回 true。 [ -b $file ] 返回 false。
-c file 檢測文件是否是字符設備文件,如果是,則返回 true。 [ -c $file ] 返回 false。
-d file 檢測文件是否是目錄,如果是,則返回 true。 [ -d $file ] 返回 false。
-f file 檢測文件是否是普通文件(既不是目錄,也不是設備文件),如果是,則返回 true。 [ -f $file ] 返回 true。
-g file 檢測文件是否設置了 SGID 位,如果是,則返回 true。 [ -g $file ] 返回 false。
-k file 檢測文件是否設置了粘着位(Sticky Bit),如果是,則返回 true。 [ -k $file ] 返回 false。
-p file 檢測文件是否是有名管道,如果是,則返回 true。 [ -p $file ] 返回 false。
-u file 檢測文件是否設置了 SUID 位,如果是,則返回 true。 [ -u $file ] 返回 false。
-r file 檢測文件是否可讀,如果是,則返回 true。 [ -r $file ] 返回 true。
-w file 檢測文件是否可寫,如果是,則返回 true。 [ -w $file ] 返回 true。
-x file 檢測文件是否可執行,如果是,則返回 true。 [ -x $file ] 返回 true。
-s file 檢測文件是否爲空(文件大小是否大於0),不爲空返回 true。 [ -s $file ] 返回 true。
-e file 檢測文件(包括目錄)是否存在,如果是,則返回 true。 [ -e $file ] 返回 true。


流程控制


if語句

if [ $a == $b ]
then
   echo "a 等於 b"
elif [ $a -gt $b ]
then
   echo "a 大於 b"
elif [ $a -lt $b ]
then
   echo "a 小於 b"
else
   echo "沒有符合的條件"
fi

注意是elif不是elseif

for循環

for loop in `seq 10`
do
    echo "$loop"
done


循環支持break和continue


while循環


int=1
while [ $int -lt 5 ]
do
        echo $int
        let "int++"
done

循環支持break和continue

switch/case語句


echo '輸入 1 到 4 之間的數字:'
echo '你輸入的數字爲:'
read aNum
case $aNum in
    1)  echo '你選擇了 1'
    ;;
    2)  echo '你選擇了 2'
    ;;
    3)  echo '你選擇了 3'
    ;;
    4)  echo '你選擇了 4'
    ;;
    *)  echo '你沒有輸入 1 到 4 之間的數字'
    ;;
esac

;; 相當於break

獲取用戶控制檯輸入


read -p (提示語句)  -t(等待時間) -n(字符個數) -s(不回顯)  readvalue

read命令提供了-p參數,允許在read命令行中直接指定一個提示
-t選項指定read命令等待輸入的秒數。當計時滿時,read命令返回一個非零退出狀態
-n選項設置read命令計數輸入的字符。當輸入的字符數目達到預定數目時,自動退出,並將輸入的數據賦值給變量
-s選項能夠使read命令中輸入的數據不顯示在監視器上(實際上,數據是顯示的,只是read命令將文本顏色設置成與背景相同的顏色)

在read命令行中也可以不指定變量.如果不指定變量,那麼read命令會將接收到的數據放置在環境變量REPLY中


echo顏色設置


#colour level
SETCOLOR_SUCCESS="echo -en \\033[1;32m"
SETCOLOR_FAILURE="echo -en \\033[1;31m"
SETCOLOR_WARNING="echo -en \\033[1;33m"
SETCOLOR_NORMAL="echo -en \\033[0;39m"

#定義記錄日誌的函數
log_info()
{
    time=`date "+%D %T"`
    echo "[$time] : INFO    : $*"
    $SETCOLOR_NORMAL
}

log_warn()
{
    time=`date "+%D %T"`
    $SETCOLOR_WARNING
    echo "[$time] : WARN    : $*"
    $SETCOLOR_NORMAL
}

log_succ()
{
    time=`date "+%D %T"`
    $SETCOLOR_SUCCESS
    echo "[$time] : SUCCESS : $*"
    $SETCOLOR_NORMAL
}

log_error()
{
    time=`date "+%D %T"`
    $SETCOLOR_FAILURE
    echo "[$time] : ERROR   : $*"
    $SETCOLOR_NORMAL
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章