1. 程式人生 > 程式設計 >shell程式設計入門之變數,字串,陣列,函式使用方法總結

shell程式設計入門之變數,字串,陣列,函式使用方法總結

一. 變數

變數定義

定義變數時,變數名不加美元符號

your_name="jb51.net"

注意,變數名和等號之間不能有空格。

除了顯式地直接賦值,還可以用語句給變數賦值,如,

for file in `ls /etc`
或
for file in $(ls /etc)

已定義的變數,可以被重新定義,如,

your_name="tom"
echo $your_name
your_name="alibaba"
echo $your_name

注意,第二次賦值的時候不能寫$your_name="alibaba",使用變數的時候才加美元符($)。

使用變數

使用一個定義過的變數,只要

在變數名前面加美元符號即可,如,

your_name="qinjx"
echo $your_name
echo ${your_name}

變數名外面的花括號是可選的,加不加都行,
加花括號是為了幫助直譯器識別變數的邊界,比如下面這種情況,

for skill in Ada Coffe Action ; do
    echo "I am good at ${skill}Script"
done

推薦給所有變數加上花括號,這是個好的習慣。

只讀變數

使用 readonly 命令可以將變數定義為只讀變數,只讀變數的值不能被改變。
下面的例子嘗試更改只讀變數,結果報錯,

#!/bin/bash
myUrl="//www.jb51.net"
readonly myUrl
myUrl="http://www.jb51.com"

執行,結果如下,

/bin/sh: NAME: This variable is read only.

刪除變數

使用 unset 命令可以刪除變數,

#!/bin/sh
myUrl="//www.jb51.net"
unset myUrl
echo $myUrl

以上例項執行將沒有任何輸出

注意:unset 命令不能刪除只讀變數。

變數型別

執行shell時,會同時存在三種變數:

(1)區域性變數區域性變數在指令碼或命令中定義,僅在當前shell例項中有效,其他shell啟動的程式不能訪問區域性變數。

(2)環境變數所有的程式,包括shell啟動的程式,都能訪問環境變數,有些程式需要環境變數來保證其正常執行。

必要的時候shell指令碼也可以定義環境變數。

(3)shell變數shell變數是由shell程式設定的特殊變數。
shell變數中有一部分是環境變數,有一部分是區域性變數,這些變數保證了shell的正常執行。

特殊變數用途
$0當前指令碼的檔名
$n傳遞給指令碼或函式的引數。n 是一個數字,表示第幾個引數。例如,第一個引數是1,第二個引數是2。
$#傳遞給指令碼或函式的引數個數。
$*傳遞給指令碼或函式的所有引數。
$@傳遞給指令碼或函式的所有引數。被雙引號(" ")包含時,與 $* 稍有不同,下面將會講到。
$?上個命令的退出狀態,或函式的返回值。
$$當前Shell程序ID。對於 Shell 指令碼,就是這些指令碼所在的程序ID。

字串http://www.cppcns.com

單引號與雙引號

字串可以用單引號,也可以用雙引號,也可以不用引號。

(1)單引號字串的限制單引號裡的任何字元都會原樣輸出,單引號字串中的變數是無效的
單引號字串中不能出現單獨一個的單引號(對單引號使用轉義符後也不行),但可成對出現,作為字串拼接使用。

(2)雙引號的優點雙引號裡可以有變數
雙引號裡可以出現轉義字元

your_name="jb51"

# 使用雙引號拼接
greeting="hellohttp://www.cppcns.com,"$your_name" !"
greeting_1="hello,${your_name} !"
echo $greeting  $greeting_1

# 使用單引號拼接
greeting_2='hello,'$your_name' !'
greeting_3='hello,${your_name} !'
echo程式設計客棧 $greeting_2  $greeting_3
hello,runoob ! hello,runoob !
hello,${your_name} !

字串長度

string="abcd"
echo ${#string} #輸出 4

提取子字串

以下例項從字串第 2 個字元開始擷取 4 個字元,

string="jb51.net is a great site"
echo ${string:1:4} # 輸出 b51.

查詢子字串

查詢字元 io 的位置(哪個字母先出現就計算哪個):

string="jb51 is a great site"
echo `expr index "$string" i5`  # 輸出 3

注意: 以上指令碼中 ` 是反引號,而不是單引號 '

反引號括起來的字串被shell解釋為命令列,
在執行時,shell首先執行該命令列,並以它的標準輸出結果取代整個反引號(包括兩個反引號)部分。

OPDATE=`date`

就是把date -d '-1 day' +%Y%m%d這條命令的結果賦給變數OPDATE

此外,反引號是一個老的用法,$()才是新的用法,例如,

OPDATE=$(date)

註釋

單行註釋

# 開頭的行就是註釋,會被直譯器忽略。

通過每一行加一個 # 號設定多行註釋,

#--------------------------------------------
# 這是一個註釋
# author:xxx
#--------------------------------------------
##### 使用者配置區 開始 #####
#
#
# 這裡可以新增指令碼描述資訊
# 
#
##### 使用者配置區 結束  #####

多行註釋

:<<EOF
註釋內容...
註釋內容...
註釋內容...
EOF

EOF 也可以使用其他符號,

:<<'
註釋內容...
註釋內容...
註釋內容...
'
:<<!
註釋內容...
註釋內容...
註釋內容...
!

陣列

bash支援一維陣列(不支援多維陣列),並且沒有限定陣列的大小。
類似於 C 語言,陣列元素的下標由 0 開始編號。

定義陣列

在 Shell 中,用括號來表示陣列,陣列元素用"空格"符號分割開,

陣列名=(值1 值2 ... 值n)

例如:

array_name=(value0 value1 value2 value3)

或者

array_name=(
value0
value1
value2
value3
)

還可以單獨定義陣列的各個分量:

array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen

可以不使用連續的下標,而且下標的範圍沒有限制。

讀取陣列

讀取陣列元素值的一般格式是,

${陣列名[下標]}

例如:

valuen=${array_name[n]}

使用 @ 符號可以獲取陣列中的所有元素,例如:

echo ${array_name[@]}

取得陣列元素的個數

length=${#array_name[@]}

或者

length=${#array_name[*]}

取得陣列單個元素的長度,

lengthn=${#array_name[n]}

函式

無參呼叫

#!/bin/bash

demoFun(){
    echo "這是我的第一個 shell 函式!"
}
echo "-----函式開始執行-----"
demoFun
echo "-----函式執行完畢-----"

Plain Text
-----函式開始執行-----
這是我的第一個 shell 函式!
-----函式執行完畢-----

返回值

#!/bin/bash

funWithReturn(){
    echo "這個函式會對輸入的兩個數字進行相加運算..."
    echo "輸入第一個數字: "
    read aNum
    echo "輸入第二個數字: "
    read anotherNum
    echo "兩個數字分別為 $aNum 和 $anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "輸入的兩個數字之和為 $? !"
這個函式會對輸入的兩個數字進行相加運算...
輸入第一個數字: 
1
輸入第二個數字: 
2
兩個數字分別為 1 和 2 !
輸入的兩個數字之和為 3 !

帶引數呼叫

#!/bin/bash

funWithParam(){
    echo "第一個引數為 $1 !"
    echo "第二個引數為 $2 !"
    echo "第十個引數為 $10 !"
    echo "第十個引數為 ${10} !"
    echo "第十一個引數為 ${11} !"
    echo "引數總數有 $# 個!"
    echo "作為一個字串輸出所有引數 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
第一個引數為 1 !
第二個引數為 2 !
第十個引數為 10 !
第十個引數為 34 !
第十一個引數為 73 !
引數總數有 11 個!
作為一個字串輸出所有引數 1 2 3 4 5 6 7 8 9 34 73 !

更多關於shell程式設計的知識請檢視下面的相關連結