《學習bash》筆記--基礎shell編程

來源:互聯網
上載者:User

標籤:style   使用   檔案   io   cti   re   

1.shell指令碼和函數指令碼是包含shell命令的檔案,它是一個shell程式,有三種方式運行它們:一是鍵入source scriptname,使得指令碼的命令被讀取並運行,就好像鍵入它們一樣。二是運行bash scriptname,開啟一個子shell來讀取並執行指令檔中命令。該指令檔可以無"執行許可權"。三是使用./scriptname,開啟一個子shell讀取並執行指令檔中的命令,該指令碼需要“執行許可權”。
1.1.函數函數是一種指令碼內指令碼,你使用它通過名字來定義某些shell代碼,並將其儲存在shell記憶體中以便以後進行調用和運行。要定義一個函數可以使用下述兩種格式:function funcname{shell commands}或者funcname(){shell commands}兩者沒有功能上的區別。可以使用命令unset -f funcname刪除一個函數定義。
鍵入declare -f命令找到登入工作階段中定義的函數,該命令列印函數名和函數定義,如果只需要列印函數定義,可以使用declare -F命令。
在shell中鍵入一個命令時,各種資源的優先順序次序如下:1.別名2.關鍵字,例如 fucntion3.函數4.shell的內建命令,如cd和type5.指令碼的可執行程式。shell按在PATH環境變數中列出的目錄中隊其進行搜尋。可以使用內建的command、builtin和enable百變優先順序次序,會在以後進行介紹。
可以使用type命令查看命令的特定細節:如果使用type  command,按照上面的優先順序次序尋找命令的資訊,找到其中一個後就結束。如果使用type -all command,按照上面的優先順序次序尋找所命令的資訊,顯示所有資源的資訊。如果使用type -type command,輸出單個單詞描述符:關鍵字,函數,內建命令或者檔案。


2.shell變數2.1.位置參數

可以使用varname=value的語句定義變數值,例如:

hatter=mad
 echo "$hatter"
mad

最重要的特定內建變數稱為位置參數,當指令碼被調用時,它們儲存指令碼的命令參數。位置參數名為1,2,3等,其值由$1,$2,$3表示。

還有一個位置參數0,其值為指令碼名。

還有兩個特殊變數包含了所有的位置參數(出了位置參數0):*和@。它們的差別不明顯但很重要,並且只有在雙引號內才體現出來。

“$*”是包含所有參數位置的單一字串,由環境變數IFS(內部域分隔字元,internal field seperator)中第一個字元分隔。IFS預設為

空格、TAB和NEWLINE。另一方面,“[email protected]”等價於“$1”"$2"...."$N",這裡N為位置參數數目,等價於N個單獨的由空格分隔的雙引號

字串。如果沒有位置參數,“[email protected]”為空白。

最後“$#”是參數的數量。


使用如下指令碼params進行測試:

echo "[email protected]"
echo "$*"
echo "$0 $1 $2 $3"
echo "$#"

執行的結果是:

./params 1 2 3
1 2 3
1 2 3
./params 1 2 3
3


2.2.函數內位置參數

shell函數使用位置參數和特殊變數,如*和#,其方式與shell指令碼一樣,典型情況下,在一個shell指令碼裡都要定義幾個shell函數,

因此每個函數都要處理自己的參數,這表明每個函數都要分別跟蹤位置參數,每個函數都有這些變數的副本,我們稱這些變數

對函數是局部的。

然而,在函數內定義的其他變數則不是局部的,其取值愛真箇shell指令碼中均為已知。

使用如下指令碼進行測試:

func_a()
{
echo "$0,$1,$2"
var1="var1 in func_a"
echo "var1:$var1"
}

var1="var1 out func_a"
echo "var1:$var1"
func_a arg1 arg2
echo "var1:$var1"
echo "$0,$1,$2"

執行指令碼:

$./var.sh 1 2

var1:var1 out func_a
./var.sh,arg1,arg2
var1:var1 in func_a
var1:var1 in func_a
./var.sh,1,2

在函數外定義的var1被函數內的賦值給覆蓋了。


2.3.函數內局部變數

函數定義中的local定義使所涉及的變數均為函數的局部變數。將上面的指令碼修改如下:

func_a()
{
echo "$0,$1,$2"
local var1="var1 in func_a"
echo "var1:$var1"
}

var1="var1 out func_a"
echo "var1:$var1"
func_a arg1 arg2
echo "var1:$var1"
echo "$0,$1,$2"

執行結果:

$./var.sh 1 2

var1:var1 out func_a
./var.sh,arg1,arg2
var1:var1 in func_a
var1:var1 out func_a
./var.sh,1,2

此時在函數內的var1變成了局部變數。


2.4.對[email protected]和$*進行引用

為什麼“$*”用IFS的第一個字元而不是用空格分隔呢,這時為了輸出的靈活性。下面是一個簡單的例子,列印逗號分隔的位置參數

列表,指令碼為:

IFS=,
echo "$*"

運行結果為:

$./a.sh 1 2 3
1,2,3

為什麼“[email protected]”用作N個獨立的雙引號引用字串呢?目的是允許你再次分別使用它們。


2.5.變數文法詳解

取一個變數值的$varname的文法實際上是常用文法${varname}的簡化形式。

為什麼要有兩種文法呢,一個原因是,如果代碼中引用了多餘9個位置參數,則必須使用${10}而不是$10.

使用如下指令碼進行測試:

echo "$0 $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $20"

運行結果:

$./params 1 2 3 4 5 6 7 8 9 0

./params 1 2 3 4 5 6 7 8 9 10

$10被解釋為$1後面跟一個字元0,所以$10為10.

還要考慮下面情況,如果要在使用者ID後面放一個底線。

echo $UID_

shell會試圖使用UID_作為變數名。必須使用${UID}_


3.字串操作

替換操作符:

${varname:-word}

如果varname存在並且非null,返回其值,否則返回word。

${varname:=word}

如果varname存在並且非null,返回其值,否則將其設定為word,然後返回其值。位置參數和特殊餐宿不能這樣設定。

${varname:=?message}

如果varname存在並且非null,返回其值,否則列印varname:message,並推出當前命令或指令碼。省略message則產生預設

資訊:parameter null or not set。

${varname:+word}

如果varname存在並且非null,返回word,否則返回null。

${varname:offset}

${varname:offset:length}

執行字串擴充。返回$varname從offset開始,長度為length的子字串。如果長度省略,字串從offset開始,一直到$varname

結束。如果varname為@,length則為從參數offset開始的位置參數的數目。


模式比對操作符:(模式可能包含任一字元的字串,用於字元設定和範圍的*,?和[])

${variable#pattern}

如果模式比對變數取值的開頭,刪除最短的匹配部分,返回剩餘部分。

${variable##pattern}

如果模式比對變數取值的開頭,刪除最長的匹配部分,返回剩餘部分。

${variable%pattern}

如果模式比對變數取值的結尾,刪除最短的匹配部分,返回剩餘部分。

${variable%%pattern}

如果模式比對變數取值的結尾,刪除最長的匹配部分,返回剩餘部分。

${variable/pattern/string}

${variable//pattern/string}

將variable中匹配模式的最長部分替換成string。第一種格式中,只有第一個匹配部分被替換,第二種格式中,所有匹配部分均被

替換。如果模式以#開頭,必須匹配variable的開頭。如果以%開頭,則必須匹配variable的結尾。如果string為null,匹配部分被刪除。

如果variable為@或*,操作為依次應用於每個位置參數並且擴充為結果清單。


長度操作符:
${#varname}返回變數字串的長度。


4.命令替換

命令替換允許你使用命令的標準輸出,就好像它是一個變數值一樣。命令替換的文法是:
$(command)

運行圓括弧內的命令,該命令寫到標準輸出的內容返回作為運算式值。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.