




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、 第 27 章shell 腳本基礎(chǔ)shell 腳本是一種簡單而且功能強(qiáng)大的腳本語言。在 Linux 環(huán)境的編程過程中,shell 腳本能夠很好地配合 C 語言的工作。創(chuàng)建一個(gè) shell 腳本,再使用一系列 shell 命令的組合, 可以快速而方便地完成相應(yīng)工作。因此,shell 腳本無論對于 Linux 系統(tǒng)管理員還是 Linux環(huán)境下的編程人員來說是很有實(shí)用價(jià)值的。本章將介紹編寫 shell 腳本的基礎(chǔ)知識。 27.1編寫最簡單的 shell 腳本shell 腳本的基本構(gòu)成元素是 shell 命令,例如“l(fā)s”,“pwd”等命令都可以出現(xiàn)在 shell 腳本中。學(xué)習(xí)書寫 shell 腳本需
2、要從最簡單的腳本開始寫起,就像學(xué)習(xí) C 語言要先寫“helloword”程序一樣。本節(jié)將介紹最基本的 shell 腳本的寫法。 27.1.1使用shell 腳本的原因shell 腳本在處理自動(dòng)循環(huán)的任務(wù)方面功能很強(qiáng)大。如果用戶需要處理一個(gè)大型的任務(wù)時(shí),傳統(tǒng)的做法是列出處理任務(wù)所需要的命令,一個(gè)一個(gè)地輸入命令并且觀察輸出結(jié)果。如果命令的運(yùn)行結(jié)果正確,則繼續(xù)任務(wù)的下一步操作;否則再回到察。其流程如圖 27-1 所示。 一步步觀圖 27-1 傳統(tǒng)的 Linux 任務(wù)處理流程 當(dāng)這個(gè)大型任務(wù)需要處理很多次時(shí),需要將這些繁瑣的命令輸入若干次,這是令每一 第 27 章 shell 腳本基礎(chǔ)個(gè)系統(tǒng)管理員或者
3、編程者惱火的。不僅僅是因?yàn)楣ぷ髁康木薮?,而且重?fù)的機(jī)器型勞動(dòng)造成出錯(cuò)的概率也是很大的。使用 shell 腳本可以解決這個(gè)問題。 創(chuàng)建一個(gè) shell 腳本,使用一系列 shell 命令的組合,再配以簡單的 shell 腳本變量、條件判斷、算術(shù)表達(dá)式和循環(huán)控制結(jié)構(gòu),可以快速地完成相應(yīng)工作。這樣的做法更有效率。執(zhí)行 shell 腳本代替了在 shell 中依次輸入每一個(gè)命令,而且大大降低了出錯(cuò)的可能,因?yàn)橛?jì)算機(jī)的長處就是處理這種大量的重復(fù)性的工作。 因此使用 shell 腳本可以說是發(fā)揮了人和計(jì)算機(jī)的特長,不失為一種理想的解決問題的 方案。使用 shell 腳本處理任務(wù)的執(zhí)行流程如圖 27-2 所
4、示。 圖 27-2 使用 shell 腳本處理任務(wù)的流程 27.1.2腳本內(nèi)容shell 腳本本身并不復(fù)雜,它是一種解釋型語言。在執(zhí)行一個(gè) shell 腳本時(shí),解釋器掃描一行腳本代碼,之后執(zhí)行這個(gè)代碼。shell 腳本的第一行總是以一個(gè)固定的語句開頭的。#!/bin/sh這行語句表示這段腳本使用程序/bin/sh 解釋器對其進(jìn)行解釋并且執(zhí)行。這個(gè)解釋器就是 shell。shell 腳本中的注釋以“#”字符開頭,解釋器并不解釋注釋。與 C 語言不同的是, shell 中的注釋會(huì)注視調(diào)用“#”字符以后的所有內(nèi)容,直到這一行結(jié)束。在解釋器程序掃描到注釋時(shí)會(huì)跳過“#”之后所有的內(nèi)容。因此,不要在“#”
5、字符后面書寫任何有用的否語句。 在第二行注釋中寫入腳本名是一個(gè)好習(xí)慣。下面實(shí)例演示了一個(gè)簡單的 shell 腳本,這個(gè)腳本中沒有命令,只有注釋,因此什么都不做。 程序27-1 test.sh819#!/bin/sh Linux C 程序設(shè)計(jì)大全當(dāng)一個(gè) shell 腳本開始執(zhí)行時(shí),解釋器程序從上到下掃描腳本中的命令和語句,并且執(zhí) 行每一個(gè)語句。 27.1.3運(yùn)行一段腳本運(yùn)行一個(gè) shell 腳本前需要增加其執(zhí)行權(quán)限,使其具有可執(zhí)行的權(quán)限。在運(yùn)行 shell 腳本時(shí)應(yīng)該確保正確的腳本路徑。下面實(shí)例演示了一個(gè) shell 腳本的執(zhí)行。 (1)在 vi 編輯器中編輯該腳本如下: 程序27-2 test
6、.shshell 腳本的后綴名是“.sh”。echo 命令用于在屏幕上輸出一行字符串,其作用有點(diǎn)類似于 C 語言中的 printf 函數(shù)。 (2)編寫好腳本后,增加 shell 腳本文件的可執(zhí)行權(quán)限??梢允褂?chmod 命令增加 test.sh文件的可執(zhí)行權(quán)限。 $ chmod u+x test.sh(3)在 shell 中運(yùn)行該 shell 腳本,只輸入 shell 腳本的文件名如下: $test.sh(4)輸出錯(cuò)誤信息。 bash : test.sh command not found(5)使用相對路徑名執(zhí)行該 shell 腳本如下:最簡單的 shell 腳本已經(jīng)運(yùn)行成功了。在此總結(jié) s
7、hell 腳本的編寫流程如下:在編輯器中編輯 shell 腳本文件。將該文件保存為“*.sh”文件。增加腳本文件的可執(zhí)行權(quán)限。 使用相對路徑名執(zhí)行腳本文件。 其流程如圖 27-3 所示。820$./test.sh hello world#!/bin/sh #test.sh#輸出一個(gè)字符串 hello world echo hello world#test.sh#第二行是腳本的名稱。這是一個(gè)測試用的腳本,演示注釋的使用 第 27 章 shell 腳本基礎(chǔ)圖 27-3 書寫 shell 腳本的一般流程 27.2shell 中的變量shell 語言中可以使用變量,不過這里的變量不同于其他的高級語言中
8、的變量。本小節(jié)將介紹在 shell 腳本中使用變量。 27.2.1用戶自定義變量在編寫 shell 腳本的過程中,用戶可以使用自定義的變量來保存數(shù)據(jù)。這一點(diǎn)類似于 C 語言中的變量。下面程序段簡單示意了 shell 中變量的定義: 在 shell 中使用變量時(shí)需要在變量名之前加上一個(gè)“$”字符。“$”字符作為 shell 腳本中的一個(gè)保留字,表示變量的開始。與 C 語言不同的是,shell 腳本中的變量在使用時(shí)并不需要提前定義,也就是說每一個(gè)變量都可以在程序員需要時(shí)就使用。 這樣就大大增強(qiáng)了程序的靈活性,下面實(shí)例演示了計(jì)算變量 a 和變量 b 的和的簡單程序,筆者分別給出了 C 語言版本和 s
9、hell 腳本的版本,讀者可以通過對比的方式發(fā)現(xiàn)二者的不同。 程序27-3 add.c 計(jì)算兩個(gè)變量的和,C 語言版本821#include $number=1$a=2$b=3$c=$a+$b$filename=test.txt$string=hello world Linux C 程序設(shè)計(jì)大全下面代碼是一個(gè) shell 版本的計(jì)算兩個(gè)變量和的小程序,變量可以不聲明而直接使用。程序27-4 add.sh 計(jì)算兩個(gè)變量的和,shell 腳本版本因?yàn)榇蟛糠?Linux 命令使用的是小寫字母,而大多數(shù)的 shell 中的環(huán)境變量是使用大些字母表示的。因此,在 shell 腳本中出現(xiàn)的用戶自定義變量最
10、好使用小寫字母,這樣可以很好地區(qū)別 shell 中的環(huán)境變量。 注意:shell 腳本中的變量名同樣是對大小寫敏感的。 因此,環(huán)境變量$PATH 和用戶自定義變量$path 是不一樣的。這種書寫規(guī)則并不是強(qiáng)制性的,但這樣的寫法符合通用的 shell 變量名的書寫規(guī)則。 shell 中變量的賦值是由左至右進(jìn)行的,下面實(shí)例演示了在 shell 腳本中使用多重賦值。 (1)在 vi 編輯器中編輯該腳本如下: 程序27-5 var.sh 演示 shell 腳本中變量的多重賦值(2)編寫好腳本后,增加 shell 腳本文件的可執(zhí)行權(quán)限??梢允褂?chmod 命令增加 var.sh 文件的可執(zhí)行權(quán)限。 8
11、22#!/bin/sh#var.c 演示 shell 腳本中變量的多重賦值 x=2 y=$xecho x is $x, y is $y#!/bin/sh #add.sh$a=1$b=2$sum=$(a+b)#計(jì)算兩個(gè)變量的和,需要數(shù)值時(shí)應(yīng)在表達(dá)式的外面加一個(gè)“$”符echo the res is $sumint main(void)int a, b;a = 1;b = 2;printf(the sum is : %dn, a + b); return 0; 第 27 章 shell 腳本基礎(chǔ)$ chmod u+x var.sh(3)在 shell 中運(yùn)行該 shell 腳本如下:使用 unse
12、t 命令可以刪除變量的賦值,使變量的值為空。如果用戶需要清除一個(gè)變量的值可以這樣做,其等效于將這個(gè)變量賦值為空。下面實(shí)例演示了使用 unset 命令清除一個(gè)變量的值。 (1)在 vi 編輯器中編輯該腳本如下: 程序27-6 unset.sh 使用 unset 命令清除一個(gè)變量的值(2)編寫好腳本后,增加shell 腳本文件的可執(zhí)行權(quán)限??梢允褂胏hmod 命令增加unset.sh文件的可執(zhí)行權(quán)限。 $ chmod u+x unset.sh(3)在 shell 中運(yùn)行該 shell 腳本如下:在輸出 string 變量的值時(shí)其值已經(jīng)變成了空值,因此打印了一個(gè)換行。27.2.2引用變量在 shel
13、l 腳本中需要引用一個(gè)變量時(shí)可以有 3 種方法。這 3 種方法區(qū)別不大,通用的一點(diǎn)是需要在引用的變量名之前加上一個(gè)“$”字符。 q 使用雙引號引用變量 $varq 使用大括號引用變量 823 $./unset.sh before clearance hello world after clearance#!/bin/sh#unset.sh 使用 unset 清除變量的值 echo before clearance string=hello worldecho $string#輸出 string 變量的原來的值 echo after clearance unset $stringecho $st
14、ring#輸出清除了 string 變量后的值 $./var.shx is 2, y is 2 Linux C 程序設(shè)計(jì)大全$varq 直接引用變量 $var使用雙引號的方法來引用變量,可以阻止所有在引號中的特殊字符被重新解釋。雙引號在表示變量的值時(shí)也有很大的用處能夠阻止單詞分割。如果一個(gè)字符串被雙引號括起來時(shí),那么這個(gè)字符串將被認(rèn)為是一個(gè)整體。即使字符串中包含空格,里面的各個(gè)單詞也不會(huì)被分開。下面實(shí)例演示了使用雙引號來包括一個(gè)整個(gè)的字符串。 (1)在 vi 編輯器中編輯該腳本如下: 程序27-7 str.sh 使用雙引號定義字符串(2)編寫好腳本后,增加 shell 腳本文件的可執(zhí)行權(quán)限???/p>
15、以使用 chmod 命令增加 str.sh文件的可執(zhí)行權(quán)限。 $ chmod u+x str.sh(3)在 shell 中運(yùn)行該 shell 腳本如下:27.2.3為表達(dá)式求值當(dāng)需要在 shell 腳本中為一個(gè)數(shù)學(xué)表達(dá)式求值時(shí),則應(yīng)該使用 expr 命令。該命令用于對一個(gè)表達(dá)式求值。通過給定的運(yùn)算符連接操作數(shù),并對操作數(shù)求值。 注意:操作數(shù)和運(yùn)算符之前必須有空格隔開。 expr 命令中可以使用數(shù)算符。例如,數(shù)字比較操作、整數(shù)運(yùn)算操作或者邏輯操作等。下面實(shí)例演示了 expr 變量對表達(dá)式的求值。 (1)在 vi 編輯器中編輯該腳本如下: 824$./str.sh hellohello world
16、#!/bin/sh#str.sh #使用雙引號包含字符串中的空格 string1=hello world string2= hello worldecho $string1 echo $string2exit 0 第 27 章 shell 腳本基礎(chǔ)程序27-8 expr.sh 演示使用 expr 命令求表達(dá)式的值(2)編寫好腳本后,增加 shell 腳本文件的可執(zhí)行權(quán)限??梢允褂?chmod 命令增加 expr.sh 文件的可執(zhí)行權(quán)限。 $ chmod u+x expr.sh(3)在 shell 中運(yùn)行該 shell 腳本如下:在 shell 腳本中也可以使用雙括號代替 expr 命令計(jì)算表達(dá)
17、式的值。其形式如下: $(表達(dá)式)注意:數(shù)學(xué)表達(dá)式有兩對括號。 下面實(shí)例使用雙括號的方法代替 expr 命令計(jì)算表達(dá)式的值。(1)在 vi 編輯器中編輯該腳本如下: 程序27-9 brace.sh 演示使用雙括號求表達(dá)式的值825#!/bin/sh# brace.sh 使用雙括號計(jì)算表達(dá)式的值 #在數(shù)學(xué)表達(dá)式中使用加法操作sum=$(3 + 2)echo $sum#在數(shù)學(xué)表達(dá)式中使用求余操作mod=$(3 % 2)$./expr.sh 516#!/bin/sh#expr.sh 使用 expr 命令計(jì)算表達(dá)式的值 #在數(shù)學(xué)表達(dá)式中使用加法操作expr 3 + 2echo $?#在數(shù)學(xué)表達(dá)式中使用
18、求余操作expr 3 % 2echo $?#在數(shù)學(xué)表達(dá)式中使用乘法操作時(shí)乘法符號必須被轉(zhuǎn)義expr 3 * 2echo $?exit 0 Linux C 程序設(shè)計(jì)大全(2)編寫好腳本后,增加 shell 腳本文件的可執(zhí)行權(quán)限。可以使用 chmod 命令增加 brace.sh 文件的可執(zhí)行權(quán)限。 $ chmod u+x brace.sh(3)在 shell 中運(yùn)行該 shell 腳本如下:27.2.4變量的類型shell 腳本中的變量很特別,因?yàn)樵谶@里變量并不區(qū)分類型。這一點(diǎn)與 C 語言以及其他的一些編程語言完全不同,也容易使初學(xué)者感到困惑。本質(zhì)上,shell 腳本中的變量都是字符串,在對變量的
19、解釋上則依賴于 shell 腳本中的變量定義,如圖 27-4 所示。 圖 27-4 shell 腳本中變量的存儲 例如,整型變量也是一個(gè)字符串,shell 允許比較操作和整數(shù)操作。其中的關(guān)鍵因素是, 這個(gè)整型變量中的值是否只有數(shù)字。如果只有數(shù)字則在進(jìn)行整數(shù)操作時(shí)將其解釋為一個(gè)整 型;如果還包含其他的字符,則只能將其解釋為字符串。 下面實(shí)例演示了 shell 腳本中的整型變量和字符串變量的使用。該腳本首先使用一個(gè)整型變量 a 進(jìn)行加法運(yùn)算,之后使用一個(gè)值中包含字母的變量 b 進(jìn)行演示。該變量轉(zhuǎn)換為了字符串的形式,即使使用 declare 命令也不能更改其類型。本腳本還演示了未初始化的變量以及值為
20、空的變量的算術(shù)運(yùn)算。其執(zhí)行流程如圖 27-5 所示。 826$./expr.sh 516echo $mod#在數(shù)學(xué)表達(dá)式中使用乘法操作mul=$(3 * 2)echo $mulexit 0 第 27 章shell 腳本基礎(chǔ)圖 27-5 整型變量與字符串變量轉(zhuǎn)換存儲的程序流程圖 (1)在 vi 編輯器中編輯該腳本如下:程序27-10 int_str.sh 演示 shell 腳本中的整型變量和字符串變量827#!/bin/bash# int_str.sh 演示整型變量和字符串變量之間的微妙差別 a=1024#整型變量 a,將其賦值為 1024$a=$a+1#累增變量 a 的值 echo the v
21、alue of a is :$ab=102a#在整型數(shù)據(jù)中混雜一個(gè)字母,把變量 b 從整型變?yōu)樽址?echo the value of b is :$bdeclare -i b#使用 declare 命令,明確指定變量 b 是一個(gè)整型變量 echo the value of b is :$b$b=$b+1#累增變量 b 的值 echo the value of b is :$b Linux C 程序設(shè)計(jì)大全(2)編寫好腳本后,增加 shell 腳本文件的可執(zhí)行權(quán)限??梢允褂?int_str.sh 文件的可執(zhí)行權(quán)限。 chmod 命令增加 (3)在 shell 中運(yùn)行該 shell 腳本如下:
22、shell 腳本不區(qū)分變量的類型有好處也有壞處。好處是使 shell 腳本程序變得更加靈活, 編寫代碼的難度也更小了;壞處是這種方法產(chǎn)生錯(cuò)誤的機(jī)率很高,而且會(huì)使程序員養(yǎng)成不好的編程習(xí)慣。因此一個(gè) C 語言的程序員轉(zhuǎn)向 shell 編程會(huì)覺得很容易,一旦習(xí)慣了 shell 腳本的編程模式,再轉(zhuǎn)回到 C 語言下進(jìn)行開發(fā)就會(huì)覺得很難了。 這就好像一個(gè)在月球居住久了的人回到地球上后不習(xí)慣于地球的重力一樣。因此,在使用 shell 腳本之前最好先確認(rèn)自己良好的編程習(xí)慣已經(jīng)養(yǎng)成,并且在使用 shell 腳本的時(shí)候時(shí)時(shí)告誡自己這種方法只適用于 shell 腳本的編程。 27.2.5操作自定義變量當(dāng)用戶定義了
23、一個(gè)變量后,除了引用這個(gè)變量外,還可以做一些其他操作。這些操作可以方便用戶使用自定義變量,同時(shí)有利于對 shell 腳本的調(diào)試。 在 shell 腳本中,變量未賦值之前其值為空。在引用該變量時(shí),允許用戶對變量設(shè)置默 認(rèn)值,其使用方法如下: var 代表設(shè)置默認(rèn)值的變量名稱,而 defaultvalue 代表該變量的默認(rèn)值。如果變量沒有被賦值,則使用設(shè)置的默認(rèn)值代替原來的空值;如果變量被設(shè)置了一個(gè)值,則使用新設(shè)置的值。如圖 27-6 所示為 shell 腳本中變量默認(rèn)值的使用。 828$var:-defaultvalue$./int_str.shthe value of a is : 1025
24、the value of b is : 102a the value of b is : 102a the value of b is : 1 the value of c is :the value of c is : 1the value of d is : 1$ chmod u+x int_str.shc=#c 變量的值是一個(gè)空值 echo the value of c is :$c$c=$c+1#使用加法運(yùn)算符操作一個(gè)值為空的變量echo the value of c is :$c$d=$d+1#使用加法運(yùn)算符操作沒有聲明的變量echo the value of d is :$dexi
25、t 0 第 27 章 shell 腳本基礎(chǔ)圖 27-6 變量默認(rèn)值的示意圖 下面實(shí)例演示了設(shè)置 shell 腳本中變量的默認(rèn)值。該腳本首先設(shè)置一個(gè)沒有值的變量, 在設(shè)置了變量的默認(rèn)值之后輸出。接下來將該變量賦值,再次輸出該變量的值。 (1)在 vi 編輯器中編輯該腳本如下: 程序27-11 default.sh 設(shè)置變量的默認(rèn)值(2)編寫好腳本后,增加 shell 腳本文件的可執(zhí)行權(quán)限。可以使用 chmod 命令增加 default.sh 文件的可執(zhí)行權(quán)限。 $ chmod u+x default.sh(3)在 shell 中運(yùn)行該 shell 腳本如下:829$default.sh linu
26、xset default-value linux 2.6.12the value is :linux new version#!/bin/sh#default.sh 設(shè)置變量的默認(rèn)值 echo linux $versionecho set default-valueecho linux $version:-2.6.12#設(shè)置變量的默認(rèn)值 echo the value is : $version#變量本身的值并沒有改變 $version=new version#將變量賦值 $ echo linux $version:-2.6.12#再次輸出該變量的值 Linux C 程序設(shè)計(jì)大全27.2.6位置
27、變量在運(yùn)行一個(gè) shell 腳本時(shí)可以向腳本傳遞命令行參數(shù),這些命令行參數(shù)可以在 shell 腳本內(nèi)部被引用到。根據(jù)每一個(gè)命令參數(shù)的位置,在 shell 中可以使用$1 至$9 來表示。$0 表示當(dāng)前執(zhí)行進(jìn)程的文件名,也就是程序的執(zhí)行文件名。 下面實(shí)例演示了使用位置變量輸出傳遞給 shell 腳本的命令行參數(shù)。 (1)在 vi 編輯器中編輯該腳本如下: 程序27-12 args.sh 輸出傳遞給 shell 腳本的命令行參數(shù)(2)編寫好腳本后,增加 shell 腳本文件的可執(zhí)行權(quán)限??梢允褂?chmod 命令增加args.sh文件的可執(zhí)行權(quán)限。 $ chmod u+x args.sh(3)在
28、shell 中運(yùn)行該 shell 腳本如下:(4)再次在 shell 中運(yùn)行該 shell 腳本,并且增加命令行參數(shù)的個(gè)數(shù)。830$./args.sh arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10 No.1 ./args.sh$./args.sh arg1 arg2 arg3 No.1 ./args.shNo.2 arg1 No.3 arg2 No.4 arg3 No.5No.6 No.7 No.8 No.9No.10#!/bin/sh#args.sh 輸出該 shell 腳本的命令行參數(shù) #輸出所有的 10 個(gè)命令行參數(shù),每個(gè)參數(shù)使用位
29、置變量表示 echo No.0 $0 echo No.1 $1 echo No.2 $2 echo No.3 $3 echo No.4 $4 echo No.5 $5 echo No.6 $6 echo No.7 $7 echo No.8 $8 echo No.9 $9 第 27 章 shell 腳本基礎(chǔ)由此可知,空余的位置變量會(huì)被設(shè)置為空值,而多余的命令行參數(shù)則不能被保存在位置變量中。位置變量的作用是很大的,活用位置變量將大大提高 shell 腳本的功能。 27.2.7重新分配位置變量使用 shift 命令會(huì)重新分配位置參數(shù),該操作把所有的位置參數(shù)都向左移動(dòng)一個(gè)位置。也就是說原來的$2 變成
30、了$1,而$9 變成了$8,如圖 27-7 所示。 圖 27-7 重新分配位置變量 原來的$1 就消失了,但是$0(shell 腳本文件的名稱)是不會(huì)改變的。如果傳遞了大量的位置參數(shù)到腳本中,那么 shift 命令允許用戶訪問超過位置變量所能表示的命令行參數(shù)。 下面實(shí)例演示了使用 shift 命令訪問到第 10 個(gè)命令行參數(shù)以后的命令行參數(shù)。 (1)在 vi 編輯器中編輯該腳本如下: 程序27-13 shift.sh 訪問第 10 個(gè)以后的命令行參數(shù)831#!/bin/sh#shift.sh 訪問第 10 個(gè)以后的命令行參數(shù) #輸出所有的 10 個(gè)命令行參數(shù),每個(gè)參數(shù)使用位置變量表示 echo
31、 No.0 $0 echo No.1 $1echo No.2 $2No.2 arg1 No.3 arg2 No.4 arg3 No.5 arg4 No.6 arg5 No.7 arg6 No.8 arg7 No.9 arg8No.10 arg9 Linux C 程序設(shè)計(jì)大全(2)編寫好腳本后,增加 shell 腳本文件的可執(zhí)行權(quán)限。可以使用 chmod 命令增加shift.sh h 文件的可執(zhí)行權(quán)限。 $ chmod u+x shift.sh(3)在 shell 中運(yùn)行該 shell 腳本如下:832$./shift.sh arg1 arg2 arg3 arg4 arg5 arg6 arg7
32、arg8 arg9 arg10 No.1 ./args.shNo.2 arg1 No.3 arg2 No.4 arg3 No.5 arg4 No.6 arg5 No.7 arg6 No.8 arg7 No.9 arg8 No.10 arg9 shiftingNo.1 ./args.sh No.2 arg2 No.3 arg3 No.4 arg4 No.5 arg5 No.6 arg6 No.7 arg7 No.8 arg8 No.9 arg9No.10 arg10echo No.3 $3 echo No.4 $4 echo No.5 $5 echo No.6 $6 echo No.7 $7 e
33、cho No.8 $8 echo No.9 $9ehco shifting#移位操作,將第 11 個(gè)命令行參數(shù)($10)移動(dòng)到$9 的位置,$1 就丟失了 echo No.0 $0 echo No.1 $1 echo No.2 $2 echo No.3 $3 echo No.4 $4 echo No.5 $5 echo No.6 $6 echo No.7 $7 echo No.8 $8 echo No.9 $9 第 27 章 shell 腳本基礎(chǔ)27.3退 出 狀 態(tài)exit 命令用于結(jié)束一個(gè) shell 腳本的運(yùn)行,就像 C 語言中的調(diào)用“exit(0)”,或者在main 函數(shù)中“retur
34、n 0;”一樣。shell 腳本在結(jié)束運(yùn)行時(shí)也返回一個(gè)值,并且這個(gè)值會(huì)傳遞給調(diào)用腳本的父進(jìn)程。這個(gè)父進(jìn)程通常就是 shell,但是有些時(shí)候一些其他的用戶程序也會(huì)調(diào)用 shell 腳本。父進(jìn)程接收到這個(gè)值(其實(shí)這個(gè)值作為子進(jìn)程結(jié)束狀態(tài)的一部分)后,做 下一步的處理,如圖 27-8 所示。 圖 27-8 shell 腳本退出狀態(tài)值傳遞給父進(jìn)程示意圖 每個(gè) shell 命令在結(jié)束執(zhí)行時(shí)都會(huì)返回一個(gè)退出狀態(tài)碼。成功執(zhí)行了該命令則返回 0; 否則,不成功的命令將返回一個(gè)非零值。非零值通常都被解釋成一個(gè)錯(cuò)誤碼,從慣例的角度來講返回 0 代表正常。如果返回一個(gè)非零值,則表示進(jìn)程出現(xiàn)了異常。 這時(shí)候需要根據(jù)退
35、出狀態(tài)碼找到進(jìn)程退出的原因。通常來講程序員和系統(tǒng)管理員之間應(yīng)當(dāng)約定一個(gè)退出狀態(tài)碼的協(xié)議,這樣便于系統(tǒng)管理員幫助程序員發(fā)現(xiàn)錯(cuò)誤。 注意:退出狀態(tài)碼必須是十進(jìn)制數(shù),范圍必須是 0 至 255。 當(dāng)腳本以不帶參數(shù)的 exit 命令來結(jié)束時(shí),腳本的退出狀態(tài)碼就由腳本中最后執(zhí)行的命令來決定。也就是 exit 之前的命令。下面實(shí)例演示了 shell 腳本的退出狀態(tài)碼的使用,該腳本調(diào)用一個(gè)用戶編寫的簡單程序。讀者可以對比使用 exit 命令退出和不使用該命令退出的兩個(gè)版本的 shell 腳本的區(qū)別。 (1)在 vi 編輯器中編輯測試程序。 833 Linux C 程序設(shè)計(jì)大全程序27-14 test.c 指
36、定退出狀態(tài)碼(2)在 shell 中編譯該程序。 $gcc test.c-o test(3)在 vi 編輯器中編輯該腳本如下:程序27-15 exit.sh 測試不同的退出狀態(tài)碼(4)編寫好腳本后,增加 shell 腳本文件的可執(zhí)行權(quán)限。可以使用 chmod 命令增加 exit.sh文件的可執(zhí)行權(quán)限。 $ chmod u+x exit.sh(5)在 shell 中運(yùn)行該 shell 腳本如下:(6)檢查 shell 腳本的退出狀態(tài)碼。(7)在 vi 編輯器中修改該腳本,添加 exit 退出命令。程序27-16 exit.sh 測試不同的退出狀態(tài)碼(8)再次執(zhí)行該 shell 腳本如下:$./e
37、xit.sh834#!/bin/sh#exit.sh 測試不同進(jìn)程的退出狀態(tài)碼 ./test#執(zhí)行 test 程序 exit 35#添加一個(gè) exit 退出命令 $echo $? 25$./exit.sh running#!/bin/sh#exit.sh 測試不同進(jìn)程的退出狀態(tài)碼 ./test # 執(zhí)行 test 程序 #include int main(void)printf(runningn);return 25; /* 該程序的退出狀態(tài)碼是 25 */ 第 27 章 shell 腳本基礎(chǔ)running(9)檢查該腳本的退出狀態(tài)碼。$?是一個(gè) shell 中的內(nèi)置變量,代表著最后一次運(yùn)行進(jìn)
38、程的退出狀態(tài)碼。在 shell 腳本中不寫 exit 命令的效果和下面代碼等價(jià)。 exit $?在 shell 腳本的結(jié)尾處使用 exit 命令,但是不加任何參數(shù),和上面所述的兩種情況類似。 27.4條 件 測 試在 shell 腳本中,條件測試使用專門的命令來進(jìn)行。這一點(diǎn)對于一些高級語言的程序員來說有些難以適應(yīng)。了解 shell 中繁瑣的條件測試是很必要的,否則會(huì)對分支的邏輯產(chǎn)生模 糊概念。本小節(jié)將介紹 shell 腳本中的條件測試命令。 27.4.1測試文件狀態(tài)test 命令一般有兩種格式。 test condition或 condition 注意:使用“ ”時(shí),要在條件和“ ”之間加上空
39、格。 測試文件狀態(tài)的條件表達(dá)式很多,但是最常用幾個(gè)如下所示。-d 文件是否為目錄; -s 文件是否長度大于 0; -f 文件是否是普通文件; -L 文件是否是符號鏈接; -u 文件是否設(shè)置了 suid 位;-r 文件是否可讀; -w 文件是否可寫; -x 文件是否可執(zhí)行。 當(dāng)條件測試的返回狀態(tài)是 0 時(shí),則表示測試成功,否則失敗。下面實(shí)例測試 test.txt 文件是否可讀、可寫和可執(zhí)行的。該腳本中使用兩種條件測試的方法,讀者可以對照理解。 (1)在 vi 編輯器中編輯該腳本如下: 835$echo $? 35 Linux C 程序設(shè)計(jì)大全程序27-17file.sh 測試 test.txt
40、文件是否可讀可寫可執(zhí)行(2)編寫好腳本后,增加 shell 腳本文件的可執(zhí)行權(quán)限??梢允褂?chmod 命令增加 file.sh文件的可執(zhí)行權(quán)限。 $ chmod u+x file.sh(3)使用 ls 命令查看 test.txt 的權(quán)限信息。(4)在 shell 中運(yùn)行該 shell 腳本如下:運(yùn)行結(jié)果說明 test.txt 文件只有可讀寫的權(quán)限,但是沒有可執(zhí)行的權(quán)限。下面實(shí)例測試傳入腳本的文件名的文件是否是普通文件、目錄文件和符號鏈接。該腳本使用位置變量作為文件名進(jìn)行測試。 836001001$ls l test.txt-rw-r-r-1root0Feb704:50test.txt#!/b
41、in/sh# file.sh 測試 test.txt 文件是否可讀可寫可執(zhí)行#測試 test.txt 文件的讀權(quán)限,使用“ ”的方法 -r test.txt echo $?#測試 test.txt 文件的寫權(quán)限,使用“ ”的方法 -w test.txt echo $?#測試 test.txt 文件的執(zhí)行權(quán)限,使用“ ”的方法 -x test.txt echo $?#測試 test.txt 文件的讀權(quán)限,使用“test 命令”的方法 test -r test.txt echo $?#測試 test.txt 文件的寫權(quán)限,使用“test 命令”的方法 test -w test.txt echo $
42、?#測試 test.txt 文件的執(zhí)行權(quán)限,使用“test 命令”的方法 test -x test.txt echo $?exit 0 第 27 章 shell 腳本基礎(chǔ)(1)在 vi 編輯器中編輯該腳本如下:程序27-18test.sh 測試文件的種類(2)編寫好腳本后,增加 shell 腳本文件的可執(zhí)行權(quán)限。可以使用 chmod 命令增加 test.sh文件的可執(zhí)行權(quán)限。 $ chmod u+x test.sh(3)使用 mkdir 命令創(chuàng)建一個(gè)目錄 dir。$mkdir dir(4)使用 symlink 命令創(chuàng)建一個(gè)符號鏈接。$symlink link test.txt(5)在 shel
43、l 中運(yùn)行該 shell 腳本如下:試驗(yàn)結(jié)果說明每一步的測試都是成功的,每個(gè)文件的類型都和預(yù)期的一樣。27.4.2測試時(shí)使用邏輯操作符與 C 語言類似,shell 腳本中同樣提供三種邏輯操作完成此功能。邏輯運(yùn)算符通常和分 支語句配合使用,實(shí)現(xiàn)程序執(zhí)行流程的不同。 837$./test.sh test.txt dir link 0000#!/bin/sh# test.sh 測試文件的種類 #第一個(gè)文件是一個(gè)普通文件 -f $1echo $?#第二個(gè)文件是一個(gè)目錄文件 -d $2echo $?#第二個(gè)文件是一個(gè)符號鏈接 -l $3echo $?#運(yùn)行的 shell 腳本本身也是一個(gè)普通文件 -f
44、$0 echo $?exit 0 Linux C 程序設(shè)計(jì)大全-a 邏輯與,兩個(gè)操作數(shù)均為真,結(jié)果為真,否則為假。 -o 邏輯或,兩個(gè)操作數(shù)一個(gè)為真,結(jié)果為真,否則為假。 ! 邏輯非,條件為假,結(jié)果為真,否則為假。 下面實(shí)例比較兩個(gè)文件,檢查兩個(gè)文件是否同時(shí)可寫。(1)在 vi 編輯器中編輯該腳本如下: 程序27-19 and.sh 檢查兩個(gè)文件是否同時(shí)可寫(2)編寫好腳本后,增加 shell 腳本文件的可執(zhí)行權(quán)限。可以使用 chmod 命令增加 and.sh文件的可執(zhí)行權(quán)限。 $ chmod u+x and.sh(3)使用 ls 命令查看兩個(gè)文件。(4)在 shell 中運(yùn)行該 shell
45、腳本如下:下面的例子測試兩個(gè)文件是否有一個(gè)具有可執(zhí)行權(quán)限。(1)在 vi 編輯器中編輯該腳本如下: 程序27-20 or.sh 檢查兩個(gè)文件是否有一個(gè)可寫執(zhí)行(2)編寫好腳本后,增加 shell 腳本文件的可執(zhí)行權(quán)限??梢允褂?chmod 命令增加 or.sh文件的可執(zhí)行權(quán)限。 $ chmod u+x or.sh(3)使用 ls 命令查看兩個(gè)文件。838#!/bin/sh# or.sh 檢查兩個(gè)文件是否有一個(gè)可寫執(zhí)行 -x $1 -o $0 #檢查兩個(gè)文件是否同時(shí)可寫,其中一個(gè)是 shell 腳本本身 echo $?exit 0$./and.sh test.sh 0$ls l test.txt
46、 and.sh-rw-r-r-1root0Feb704:50test.txt-rwxr-r-1root0Feb1504:52and.sh#!/bin/sh# and.sh 檢查兩個(gè)文件是否同時(shí)可寫 -w $1 -a $0 #檢查兩個(gè)文件是否同時(shí)可寫,其中一個(gè)是 shell 腳本本身 echo $?exit 0 第 27 章 shell 腳本基礎(chǔ)(4)在 shell 中運(yùn)行該 shell 腳本如下:27.4.3字符串測試字符串測試是很重要的,特別在測試用戶輸入或比較變量時(shí)其重要性尤為突出。在shell 腳本中字符串的比較沒有特定的函數(shù)。由于所有的變量均以字符串的形式存儲,因此shell 腳本中的
47、字符串可以直接進(jìn)行比較。這一點(diǎn)和 C 語言是不同的。 在 C 語言中字符串常量是以地址的形式存儲,因此,比較兩個(gè)字符串實(shí)際是在比較兩個(gè)字符串的首地址。而 shell 腳本中的字符串存儲的是字符串的內(nèi)容,因此,比較的是兩個(gè) 字符串的內(nèi)容,如圖 27-9 所示。 圖 27-9 C 語言中的字符串比較和 shell 腳本中的字符串比較 字符串測試有以下 5 種格式:839test stringtest operator stringtest string1 operator string2$./and.sh test.sh 0$ls l test.txt and.sh-rw-r-r-1root0Feb704:50test.txt-rwxr-r-1root0Feb1504:52and.sh Linux C 程序設(shè)計(jì)大全其中 string1 和 string2 代表需要測試的字符串,而 operator 代表字符串測試的操作符。這個(gè)操作共有以下 4 種可能的情況。 = 兩個(gè)字符串相等。 != 兩個(gè)字符串不等。 -z 字符串是空串。 -n 字符串是非空串。 下面實(shí)例演示了測試字符串。該實(shí)例測試三個(gè)字符串,其中有一個(gè)字符串$str3 是空串。實(shí)例中使用“ ”和“test 命令”兩種方法進(jìn)行測試。 (1)在 vi 編輯器中編輯
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 沖壓技術(shù)員崗位面試問題及答案
- 2025屆貴州省遵義航天中學(xué)高一化學(xué)第二學(xué)期期末檢測模擬試題含解析
- 2025屆江西省吉安市吉水縣第二中學(xué)化學(xué)高一下期末經(jīng)典模擬試題含解析
- 甘肅省慶陽六中2025屆化學(xué)高一下期末教學(xué)質(zhì)量檢測模擬試題含解析
- 名校聯(lián)盟2025年高一化學(xué)第二學(xué)期期末復(fù)習(xí)檢測試題含解析
- 沈陽社區(qū)食堂管理辦法
- 畢業(yè)年級學(xué)生管理辦法
- 農(nóng)村住宅風(fēng)貌管理辦法
- 河南電子票據(jù)管理辦法
- 煤礦機(jī)電設(shè)備考核體系研究
- JJF(陜) 035-2020 雨滴譜式降水現(xiàn)象儀現(xiàn)場校準(zhǔn)規(guī)范
- 科研倫理與學(xué)術(shù)規(guī)范(研究生)期末試題
- 2024年網(wǎng)格員考試題庫完美版
- 出入境交通運(yùn)輸工具檢查課件
- 2024年廣東省安全員C證(專職安全生產(chǎn)管理人員)考試試題題庫
- 防雨雪冰凍應(yīng)急演練
- GB/T 44536-2024CVD陶瓷涂層熱膨脹系數(shù)和殘余應(yīng)力試驗(yàn)方法
- 大疆在線測評題
- DB3402T 19-2021 汽車后市場 美容養(yǎng)護(hù)服務(wù)規(guī)范
- 化工公司安全知識競賽題庫(共1000題)
- DLT 572-2021 電力變壓器運(yùn)行規(guī)程
評論
0/150
提交評論