幾個shell程式設計小知識(shell常識部分)

來源:互聯網
上載者:User

標籤:blog   http   使用   檔案   for   html   工作   時間   

[轉自]http://blog.chinaunix.net/uid-168249-id-2860686.html

引用:一、使用者登陸進入系統後的系統內容變數:  
$HOME 使用者自己的目錄  
$PATH 執行命令時所搜尋的目錄  
$TZ 時區  
$MAILCHECK 每隔多少秒檢查是否有新的信件  
$PS1 在命令列時的提示號  
$PS2 當命令尚未打完時,Shell 要求再輸入時的提示號  
$MANPATH man 指令的搜尋路徑  

二、特殊變數:  

$0 這個程式的執行名字  
$n 這個程式的第n個參數值,n=1..9  
$* 這個程式的所有參數  
$# 這個程式的參數個數  
$$ 這個程式的PID  
$! 執行上一個指令的PID  
$? 執行上一個指令的傳回值  

三、shell中的變元:  
* 任一字元串  
? 一個任一字元  
[abc] a, b, c三者中之一  
[a-n] 從a到n的任一字元  

四、幾個特殊字元表示  

\b 退回  
\c 列印一行時沒有分行符號 這個我們經常會用到  
\f 換頁  
\r 斷行符號  
\t 製表  
\v 垂直製表  
\\ 反斜線本身  

五、判斷檔案的屬性  

格式:-操作符 filename  
-e 檔案存在返回1, 否則返回0  
-r 檔案可讀返回1,否則返回0  
-w 檔案可寫返回1,否則返回0  
-x 檔案可執行返回1,否則返回0  
-o 檔案屬於使用者本人返回1, 否則返回0  
-z 檔案長度為0返回1, 否則返回0.  
-f 檔案為普通檔案返回1, 否則返回0  
-d 檔案為目錄檔案時返回1, 否則返回0  

六、測試字串  
字串1 = 字串2 當兩個字串相等時為真  
字串1 != 字串2 當兩個字串不等時為真  
-n 字串      當字串的長度大於0時為真  
-z 字串      當字串的長度為0時為真  
字串       當串字串為非空時為真  

七、測試兩個整數關係  
數字1 -eq 數字2     兩數相等為真  
數字1 -ne 數字2     兩數不等為真  
數字1 -gt 數字2     數字1大於數字2為真  
數字1 -ge 數字2     數字1大於等於數字2為真  
數字1 -lt 數字2     數字1小於數字2為真  
數字1 -le 數字2     數字1小於等於數字2為真  

八、邏輯測試  
-a         與  
-o        或  
!        非  



今天介紹shell特殊字元的引用  
===============================  
shell中的特殊字元有  

1、$ 美元符  
2、\ 反斜線  
3、` 反引號  
4、" 雙引號  
5、< ,>,*,?,[,]  

下面我一一舉列說明  
一、$符號  
1、echo $? 顯示的是上一條指令退出狀態  
2、echo "$?" 效果同上  
3、echo ‘$?‘ 顯示的是$?  
4、echo \$? 顯示的是$?  
5、echo "\$?" 顯示的是$?  

  大家可能已經看出 $符號在雙引號中具有特殊意義 雙引號對$符號不起作用  
而單引號可以將特殊字元的的特殊意義屏蔽掉,使其能顯示為字元本身,反斜  
杠也可以將特殊字元的特殊含義屏蔽掉,使特殊字元失去特殊含義。  

二、\ 反斜線  
  反斜線的作用是將特殊符號字元的特殊含義屏蔽掉,使其還是原字元  
A=1234  
echo \$A 顯示為$A 如果不加\將顯示為1234  
echo \` 顯示為`  
echo \" 顯示為雙引號  
echo \\ 顯示為\  

三、` 反引號  
  反引號的功能是命令替換,將反引號中的字串做為命令來執行,我們在用shell編程時經常用的到 將系統命令的執行結果賦給一個變數  

A=`date`  
echo $A 顯示的不是date而是當時的時間串  
比如有一檔案A的內容如下   
ABCDEFG  
1234456  
abcdefg  

B=`cat A|grep 234`? # 檢索檔案A中含有字串234的行  
echo $B 將顯示為1234456  
echo "$B" 將顯示為什嗎?  
echo "\$B" 將顯示為什嗎?讀者自己試試  

四、" 雙引號  
  在系統中有些特殊字元,為避免引用這些特殊字元 往往用雙引號或單引號將這些特殊字元引起來,使其不具有特殊含義。  
  但有一部分特殊字元在引號中還是具有特殊含義,用雙引號引起來是不起作用的。本文中所列的前四個特殊字元在雙引號中還是特殊字元。為了使其不具有特殊含義一是用單引號引進來二是用\反斜線使其失去作用。  

  比如我們想原樣輸出這些特殊字元  

echo """  
echo "$"  
echo "\"  
echo "`"  
   以上不是你所期望的結果,因為雙引號對它們不起作用,你只能這樣才能輸出這些特殊字元的原形  
echo ‘"‘  
echo ‘$‘  
echo ‘\‘  
echo ‘`‘  
或  
echo "\""  
echo "\$"  
echo "\\"  
echo "\`"  
將分別顯示為 " $ \ `  
五、其它特殊字元  
  大家注意到 除了前四個特殊字元外 我將其它的特殊字元都放在一塊,這是因為前四個特殊字元在雙引號中還是具有特殊含義,所以單獨拿出來講,除此以外的特殊字元如果你要輸出這些特殊字元的原形,你就可以用雙引號或單引號引起來使其失去特殊含義。  
< ,>,*,?,[,]對shell有特殊含義 但你可以用雙引號引起來輸入這些原形  

  講了這麼多大家是不是已經注意到所有的特殊字元在單引號中失去特殊含義,如果你要輸出特殊字元原形但又記不清那些特殊字元在雙引號中不能輸出原形,建議你乾脆用單引號引起來。 

今天介紹條件測試語句  

一、if 條件陳述式   
格式:  
if 條件運算式  
then #當條件為真時執行以下語句  
命令列表  
else #為假時執行以下語句  
命令列表  
fi  

if 語句也可以嵌套使用  

if 條件運算式1  
then  
if 條件運算式2  
then  
命令列表  
else  
if 條件運算式3  
then  
命令列表  
else  
命令列表  
fi  
fi  
else  
命令列表  
fi  

你可以進行多層嵌套 一個if語句一定要跟一個fi 表示該層條件結束  否則會造成語法錯誤  
結合前面講的 舉例如下:  
這裡先講一個條件陳述式中用到的命令test 表示測試test後面的條件是否為真  

if test -f "$1"  
then  
lpr $1  
else  
if test -d "$1"  
then  
cd $1  
lpr $1  
else  
echo "$1不是檔案或目錄"  
fi  
fi  

以上的例子還可以改成如下所示  

if test -f "$1"  
then  
lpr $1  
elif test -d "$1" #elif 同else if  
then  
(cd $1;lpr $1)  
else  
echo "$1不是檔案或目錄"  
fi??????  

以上的例子不知您是否看懂是什麼意思嗎?  
假如我們現在將這個例子儲存為prfile  
chmod +x prfile  
執行剛才的程式  
./prfile aaa  

這個例子是檢查你的輸入的參數是否是一個檔案 如果是就列印 如果是一個目錄 先轉目錄再列印 如果即不是檔案也不是目錄給出提示  

二、多重條件測試語句case  
格式:  
case 字串 in  
模式) 命令列表;;  
模式) 命令列表;;  
....  
esac  

多重條件陳述式是以case 開始以esac結束 中間可以有多個條件列表 功能是測試字串和和裡面的模式有沒有匹配的,有就執行裡面的命令列表 模式也可以是*號 表示任意字串,每個模式裡面的最後要心;;雙引號結束,否則會發生語法錯誤。  

現舉例如下:  

case $1 in  
*.c)  
cc $1  
;;  
*.txt)  
lpr $1  
;;  
*)  
echo "未知的類型"  
esac  

假如將以上內容儲存在檔案abc中  

chmod +x abc  
執行 ./abc a.c   將會對檔案a.c進行編譯  
執行 ./abc readme.txt 將會把檔案通過印表機  
假如我將以上內容改一下,你是否會知道它的執行結果?  

case $1 in  
*)  
cc $1  
;;  
*.txt)  
lpr $1  
;;  
*.c)  
echo "未知的類型"  
esac  

今天介紹迴圈語句  
一. while 迴圈  
while 命令格式  

while 條件表  
do  
命令表  
done  

執行過程  

shell首先執行條件表,如果條件表的最後一條語句的退出狀態為零,則執行盾環體內的命令  
表,執行完後,再檢查條件表,如果退出狀態為零將繼續執行,如此迴圈往複直到條件表的  
最後一條語句的退出狀態非零. 退出狀態為零就是條件為真True.  

舉例說明 假如shell檔案的內容如下:  

Sum=0  
i=0  
while true #true是系統的關鍵詞 表示真  
do  
i=`expr $i + 1`  
Sum=`expr $Sum + $i`  
if [ $i = "100" ]  
then  
break;  
fi  
done  
echo $i $Sum  
最後這個程式顯示的是 100 5050  
這個程式的運算就是將1到100加起來  

下面將這個程式再改動一下  


Sum=0  
i=0  
while [ $i != "100" ]  
do  
i=`expr $i + 1`  
Sum=`expr $Sum + $i`  
done  
echo $i $Sum  

改動後的程式運算結果和上面是一樣 但程式比上面的要簡練  

在這個迴圈中還可以以until做為測試條件 它正好與while測試的條件相反,也就是當條件為假時將繼續執行迴圈體內的語句,否則就退出迴圈體,下面還用這個例子.  


Sum=0  
i=0  
until [ $i = "100" ]  
do  
i=`expr $i + 1`  
Sum=`expr $Sum + $i`  
done  
echo $i $Sum  
當i不等於100時迴圈 就是當條件為假時迴圈,否則就退出,而第一個例子是當i不等於100  
時迴圈,也就是測試條件為真時迴圈.  

二.for 迴圈  

命令格式:  
for 變數 in 名字列表  
do  
命令列表  
done  

這裡的名字列表是一個由空格分隔的字串列表,shell在執行for迴圈時每次依次從名字表  
中取出一個字串賦給迴圈變數作為變數的值.  
在寫for語句時,也可以省略in 名字列表部分,這表示用當前的位置參數來代替這時的名  
字列表.  
下面舉個例子  
比如在你的電腦中有兩個目錄,一個是aa,一個是bb在這兩個目錄中有5個相同的檔案,但其  
中一個目錄中的一個或多個檔案剛剛修改過,現在我忘記剛才改的是那幾個檔案 了,那麼我靠梢員冉弦幌掄飭礁瞿柯嫉奈募?橢?懶?程式如下:  

for File in a1 a2 a3 a4 a5  
do  
diff aa/$File bb/$File  
done  

下面再舉一個不帶名字列表的例子  

for File  
do  
echo $Filw  
done  

檔案內容儲存在a.sh中 並可執行  
我們在執行這個shell程式時命令列如下:  
a.sh a1 a2 a3 a4 a5  
執行結果如下:  
a1  
a2  
a3  
a4  
a5  
大家從這個例子中可以看到命令列的參數被逐一讀入一次  
三.迴圈控制語句  
break 命令不執行當前迴圈體內break下面的語句從當前迴圈退出.  
continue 命令是程式在本循體內忽略下面的語句,從迴圈頭開始執行.  

一,命令組合:圓括弧和花括弧  
shell中有兩種方法將命令組合在一起:圓括弧和花括弧.圓括弧使shell建立一個子shell  
來讀取並執行括起來的名命令.左括弧和右括弧不論出現在命令列中的什麼位置,shell都會  
認為它們具有特殊的組合意義的.只有用雙引號將它們括起來引用,才表示圓括弧或花括弧  
的原義.例如:  

echo a(b)  
將出現文法上的錯誤,要想輸出a(b)字串 只能括起來  
echo "a(b)"  
或echo a"("b")"  
這樣才能被shell正確解釋.  
利用組合命令有什麼作用呢?  
一,用圓括弧組合命令  
圓括弧的組合命令可以建立子進程運行組合程式,建立子進程的功能是很有用的,因為  
子shell在組合命令中的種種操作都不會影響到當前shell的各變數的值.  
例如:  
子進程在執行組合命令時改變了工作目錄,並在新的工作目錄下執行一系例命令,執行  
完後它可以不必返回原工作目錄,因為子進程工作目錄的改變不會影響到當前工作目錄.  

建立子進程後將當前的環境也同樣傳給子shell,當前shell中用export輸出到環境中的  
各變數在子shell中同樣有效.  


花括弧也可以將命令組合在一起.左 右花括弧只有作為一條命令的第一個字出現時,  
shell才它們含有特殊含義.  
與圓括弧不同的是花括弧並不建立子shell,只是由當前的shell來讀取並執行括起來的  
命令.有時使用者希望使用一組命令的順序輸出作為另一組命令的輸入,此時用花括弧是很方  
便的.  
不論是用圓括弧不是花括弧,退出狀態都是等於最後一條括起來的命令的退出狀態.  


二,可以在當前shell中執行的命令  

使用者在使用shell時一定要瞭解那些是可以在當前shell中執行的命令 那些不可以  
可以在當前shell中執行的命令有:  

break case cd continue  
echo eval exec exit  
export for if read  
readonly return set shift  
test times trap umask  
until wait while  
: {}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.