1. 程式人生 > >shell編程:基本語法

shell編程:基本語法

yellow lob 子進程 語言 unset 下劃線 image 因此 語法

要掌握一門語言,就要先掌握它的語法.如同C語言一般,shell也有自己的語法.

變量

按照慣例,Shell變量通常由字母加下劃線開頭,由任意長度的字母、數字、下劃線組成。有兩種類型的Shell變量:

  1. 環境變量

環境變量可以從父進程傳給子進程,因此Shell進程的環境變量可以從當前Shell進程傳給fork出來的子進程。用printenv命令可以顯示當前Shell進程的環境變量。

  1. 本地變量

只存在於當前Shell進程,用set命令可以顯示當前Shell進程中定義的所有變量(包括本地變量和環境變量)和函數。

環境變量是任何進程都有的概念,而本地變量是Shell特有的概念。在Shell中,環境變量和本地變量的定義和用法相似。在Shell中定義或賦值一個變量:

itcast$ VARNAME=value

註意等號兩邊都不能有空格,否則會被Shell解釋成命令和命令行參數。

一個變量定義後僅存在於當前Shell進程,它是本地變量用export命令可以把本地變量導出為環境變量,定義和導出環境變量通常可以一步完成:

itcast$ export VARNAME=value

也可以分兩步完成:

itcast$ VARNAME=value

itcast$ export VARNAME

unset命令可以刪除已定義的環境變量或本地變量。

itcast$ unset VARNAME

和C語言不同的是,Shell變量不需要明確定義類型,事實上Shell變量的值都是

字符串,比如我們定義VAR=45,其實VAR的值是字符串45而非整數。Shell變量不需要先定義後使用,如果對一個沒有定義的變量取值,則值為空字符串。

文件名代換(Globbing)

這些用於匹配的字符稱為通配符(Wildcard),如:* ? [ ] 具體如下:

* 匹配0個或多個任意字符

? 匹配一個任意字符

[若幹字符] 匹配方括號中任意一個字符的一次出現

itcast$ ls /dev/ttyS*

itcast$ ls ch0?.doc

itcast$ ls ch0[0-2].doc

itcast$ ls ch[012] [0-9].doc

註意,Globbing所匹配的文件名是由Shell展開的,也就是說在參數還沒傳給程序之前已經展開了,比如上述ls ch0[012].doc命令,如果當前目錄下有ch00.doc和ch02.doc,則傳給ls命令的參數實際上是這兩個文件名,而不是一個匹配字符串。

命令代換

由"`"反引號(在ESC鍵下面)括起來的也是一條命令,Shell先執行該命令,然後將輸出結果立刻代換到當前命令行中。例如定義一個變量存放date命令的輸出:

itcast$ DATE=`date`

itcast$ echo $DATE

命令代換也可以用$()表示:

itcast$ DATE=$(date)

也可以直接echo `date` 但是不會自動換行,即執行echo `ls -alh`之後是連續輸出不會斷行.

算術代換

使用$(()),用於算術計算,(())中的Shell變量取值將轉換成整數,同樣含義的$[ ]等價例如:

itcast$ VAR=45

itcast$ echo $(($VAR+3)) 等價於 echo $[VAR+3] $[$VAR+3]

技術分享圖片

$(())中只能用+-*/和()運算符,並且只能做整數運算

$[base#n],其中base表示進制,n按照base進制解釋,後面再有運算數,按十進制解釋。

echo $[2#10+11]

echo $[8#10+11]

echo $[16#10+11]

技術分享圖片

轉義字符

和C語言類似,\在Shell中被用作轉義字符,用於去除緊跟其後的單個字符的特殊意義(回車除外),換句話說,緊跟其後的字符取字面值。例如:

itcast$ echo $SHELL

/bin/bash

itcast$ echo \$SHELL

$SHELL

itcast$ echo \

比如創建一個文件名為"$ $"的文件($間含有空格)可以這樣:

itcast$ touch \$\ \$

還有一個字符雖然不具有特殊含義,但是要用它做文件名也很麻煩,就是-號。如果要創建一個文件名以-號開頭的文件,這樣是不正確的:

itcast$ touch -hello

touch: invalid option -- h

Try `touch --help‘ for more information.

即使加上\轉義也還是報錯:

itcast$ touch \-hello

touch: invalid option -- h

Try `touch --help‘ for more information.

因為各種UNIX命令都把-號開頭的命令行參數當作命令的選項,而不會當作文件名。如果非要處理以-號開頭的文件名,可以有兩種辦法:

itcast$ touch ./-hello

或者

itcast$ touch -- -hello

\還有一種用法,在\後敲回車表示續行,Shell並不會立刻執行命令,而是把光標移到下一行,給出一個續行提示符>,等待用戶繼續輸入,最後把所有的續行接到一起當作一個命令執行。例如:

itcast$ ls

> -l

ls -l命令的輸出)

單引號

和C語言不同,Shell腳本中的單引號和雙引號一樣都是字符串的界定符(雙引號下一節介紹),而不是字符的界定符。單引號用於保持引號內所有字符的字面值,即使引號內的\和回車也不例外,但是字符串中不能出現單引號。如果引號沒有配對就輸入回車,Shell會給出續行提示符,要求用戶把引號配上對。例如:

itcast$ echo ‘$SHELL‘

$SHELL

itcast$ echo ‘ABC\(回車)

> DE‘(再按一次回車結束命令)

ABC

DE

雙引號

被雙引號用括住的內容,將被視為單一字串。它防止通配符擴展,但允許變量擴展。這點與單引號的處理方式不同

DATE=$(date)

echo "$DATE"

echo ‘$DATE‘

技術分享圖片

再比如:

itcast$ VAR=200

itcast$ echo $VAR

200

itcast$ echo ‘$VAR‘

$VAR

itcast$ echo "$VAR"

200

shell編程:基本語法