版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
打開文本編輯器(可以使用vi/vim命令來創(chuàng)建文件),新建一個(gè)文件test.sh,擴(kuò)展名為sh(sh代表shell),擴(kuò)展名并不影響腳本執(zhí)行,見名知意就好,如果你用php寫shell腳本,擴(kuò)展名就用php好了。#!/bin/bashecho"HelloWorld!"#!是一個(gè)約定的標(biāo)記,它告訴系統(tǒng)這個(gè)腳本需要什么解釋器來執(zhí)行,即使用哪一種Shell。echo命令用于向窗口輸出文本。運(yùn)行shell腳本的兩個(gè)方法:1.作為可執(zhí)行程序:將上面的代碼保存為test.sh,并cd到相應(yīng)目錄:chmod+x./test.sh#使腳本具有執(zhí)行權(quán)限./test.sh#執(zhí)行腳本注意,一定要寫成./test.sh,而不是test.sh,運(yùn)行其它二進(jìn)制的程序也一樣,直接寫test.sh,linux系統(tǒng)會去PATH里尋找有沒有叫test.sh的,而只有/bin,/sbin,/usr/bin,/usr/sbin等在PATH里,你的當(dāng)前目錄通常不在PATH里,所以寫成test.sh是會找不到命令的,要用./test.sh告訴系統(tǒng)說,就在當(dāng)前目錄找。2.作為解釋器參數(shù):這種運(yùn)行方式是,直接運(yùn)行解釋器,其參數(shù)就是shell腳本的文件名,如:/bin/shtest.sh/bin/phptest.phpshell變量定義變量時(shí),變量名不加美元符號($,PHP語言中變量需要),如:your_name=""注意,變量名和等號之間不能有空格,這可能和你熟悉的所有編程語言都不一樣。同時(shí),變量名的命名須遵循如下規(guī)則:命名只能使用英文字母,數(shù)字和下劃線,首個(gè)字符不能以數(shù)字開頭。中間不能有空格,可以使用下劃線(_)。不能使用標(biāo)點(diǎn)符號。不能使用bash里的關(guān)鍵字(可用help命令查看保留關(guān)鍵字)。除了顯式地直接賦值,還可以用語句給變量賦值,如:forfilein`ls/etc`或forfilein$(ls/etc)以上語句將/etc下目錄的文件名循環(huán)出來。使用變量使用一個(gè)定義過的變量,只要在變量名前面加美元符號即可,如:your_name="qinjx"echo$your_nameecho${your_name}注:變量名外面的花括號是可選的,加不加都行,加花括號是為了幫助解釋器識別變量的邊界,推薦給所有變量加上花括號,這是個(gè)好的編程習(xí)慣。已定義的變量,可以被重新定義,如:your_name="tom"echo$your_nameyour_name="alibaba"echo$your_name這樣寫是合法的,但注意,第二次賦值的時(shí)候不能寫$使用變量的時(shí)候才加美元符。只讀變量使用readonly命令可以將變量定義為只讀變量,只讀變量的值不能被改變。#!/bin/bashmyUrl="http://www.w3cschool.cc"readonlymyUrlmyUrl=""運(yùn)行腳本是會出錯(cuò)。刪除變量使用unset命令可以刪除變量。語法:unsetvariable_name變量被刪除后不能再次使用。unset命令不能刪除只讀變量。變量類型運(yùn)行shell時(shí),會同時(shí)存在三種變量:1)局部變量局部變量在腳本或命令中定義,僅在當(dāng)前shell實(shí)例中有效,其他shell啟動(dòng)的程序不能訪問局部變量。2)環(huán)境變量所有的程序,包括shell啟動(dòng)的程序,都能訪問環(huán)境變量,有些程序需要環(huán)境變量來保證其正常運(yùn)行。必要的時(shí)候shell腳本也可以定義環(huán)境變量。3)shell變量shell變量是由shell程序設(shè)置的特殊變量。shell變量中有一部分是環(huán)境變量,有一部分是局部變量,這些變量保證了shell的正常運(yùn)行shell字符串字符串是shell編程中最常用最有用的數(shù)據(jù)類型(除了數(shù)字和字符串,也沒啥其它類型好用了),字符串可以用單引號,也可以用雙引號,也可以不用引號。單雙引號的區(qū)別跟PHP類似。單引號:str='thisisastring'單引號字符串的限制:單引號里的任何字符都會原樣輸出,單引號字符串中的變量是無效的;單引號字串中不能出現(xiàn)單引號(對單引號使用轉(zhuǎn)義符后也不行)。雙引號:your_name='qinjx'str="Hello,Iknowyourare\"$your_name\"!\n"雙引號的優(yōu)點(diǎn):雙引號里可以有變量雙引號里可以出現(xiàn)轉(zhuǎn)義字符拼接字符串your_name="qinjx"greeting="hello,"$your_name"!"greeting_1="hello,${your_name}!"echo$greeting$greeting_1獲取字符串長度string="abcd"echo${#string}#輸出4提取子字符串以下實(shí)例從字符串第2個(gè)字符開始截取4個(gè)字符:string="runoobisagreatsite"echo${string:1:4}#輸出unoo查找子字符串查找字符"i或s"的位置:string="runoobisagreatcompany"echo`exprindex"$string"is`#輸出8注意:以上腳本中"`"是反引號,而不是單引號"'",不要看錯(cuò)了哦。Shell數(shù)組bash支持一維數(shù)組(不支持多維數(shù)組),并且沒有限定數(shù)組的大小。類似與C語言,數(shù)組元素的下標(biāo)由0開始編號。獲取數(shù)組中的元素要利用下標(biāo),下標(biāo)可以是整數(shù)或算術(shù)表達(dá)式,其值應(yīng)大于或等于0。定義數(shù)組在Shell中,用括號來表示數(shù)組,數(shù)組元素用"空格"符號分割開。定義數(shù)組的一般形式為:數(shù)組名=(值1值2...值n)例如:array_name=(value0value1value2value3)或者array_name=(value0value1value2value3)還可以單獨(dú)定義數(shù)組的各個(gè)分量:array_name[0]=value0array_name[1]=value1array_name[n]=valuen可以不使用連續(xù)的下標(biāo),而且下標(biāo)的范圍沒有限制。讀取數(shù)組讀取數(shù)組元素值的一般格式是:${數(shù)組名[下標(biāo)]}例如:valuen=${array_name[n]}使用@符號可以獲取數(shù)組中的所有元素,例如:echo${array_name[@]}獲取數(shù)組的長度獲取數(shù)組長度的方法與獲取字符串長度的方法相同,例如:#取得數(shù)組元素的個(gè)數(shù)length=${#array_name[@]}#或者length=${#array_name[*]}#取得數(shù)組單個(gè)元素的長度lengthn=${#array_name[n]}Shell注釋以"#"開頭的行就是注釋,會被解釋器忽略。sh里沒有多行注釋,只能每一行加一個(gè)#號。只能像這樣:#--------------------------------------------#這是一個(gè)注釋#author:菜鳥教程#site:#slogan:學(xué)的不僅是技術(shù),更是夢想!#--------------------------------------------#####用戶配置區(qū)開始########這里可以添加腳本描述信息#######用戶配置區(qū)結(jié)束#####如果在開發(fā)過程中,遇到大段的代碼需要臨時(shí)注釋起來,過一會兒又取消注釋,怎么辦呢?每一行加個(gè)#符號太費(fèi)力了,可以把這一段要注釋的代碼用一對花括號括起來,定義成一個(gè)函數(shù),沒有地方調(diào)用這個(gè)函數(shù),這塊代碼就不會執(zhí)行,達(dá)到了和注釋一樣的效果。Shell傳遞參數(shù)我們可以在執(zhí)行Shell腳本時(shí),向腳本傳遞參數(shù),腳本內(nèi)獲取參數(shù)的格式為:$n。n代表一個(gè)數(shù)字,1為執(zhí)行腳本的第一個(gè)參數(shù),2為執(zhí)行腳本的第二個(gè)參數(shù),以此類推……實(shí)例以下實(shí)例我們向腳本傳遞三個(gè)參數(shù),并分別輸出,其中$0為執(zhí)行的文件名:#!/bin/bash#author:菜鳥教程#url:?echo"Shell傳遞參數(shù)實(shí)例!";echo"執(zhí)行的文件名:$0";echo"第一個(gè)參數(shù)為:$1";echo"第二個(gè)參數(shù)為:$2";echo"第三個(gè)參數(shù)為:$3";為腳本設(shè)置可執(zhí)行權(quán)限,并執(zhí)行腳本,輸出結(jié)果如下所示:$chmod+xtest.sh$./test.sh123Shell傳遞參數(shù)實(shí)例!執(zhí)行的文件名:./test.sh第一個(gè)參數(shù)為:1第二個(gè)參數(shù)為:2第三個(gè)參數(shù)為:3另外,還有幾個(gè)特殊字符用來處理參數(shù):參數(shù)處理 說明$# 傳遞到腳本的參數(shù)個(gè)數(shù)$* 以一個(gè)單字符串顯示所有向腳本傳遞的參數(shù)。如"用「」括起來的情況、以1n"的形式輸出所有參數(shù)。$$ 腳本運(yùn)行的當(dāng)前進(jìn)程ID號$! 后臺運(yùn)行的最后一個(gè)進(jìn)程的ID號$@ 與相同,但是使用時(shí)加引號,并在引號中返回每個(gè)參數(shù)。如@"用「"」括起來的情況、以"2"…"$n"的形式輸出所有參數(shù)。$- 顯示Shell使用的當(dāng)前選項(xiàng),與set命令功能相同。$? 顯示最后命令的退出狀態(tài)。0表示沒有錯(cuò)誤,其他任何值表明有錯(cuò)誤。#!/bin/bash#author:菜鳥教程#url:?echo"Shell傳遞參數(shù)實(shí)例!";echo"第一個(gè)參數(shù)為:$1";?echo"參數(shù)個(gè)數(shù)為:$#";echo"傳遞的參數(shù)作為一個(gè)字符串顯示:$*";Shell數(shù)組數(shù)組中可以存放多個(gè)值。BashShell只支持一維數(shù)組(不支持多維數(shù)組),初始化時(shí)不需要定義數(shù)組大?。ㄅcPHP類似)。與大部分編程語言類似,數(shù)組元素的下標(biāo)由0開始。Shell數(shù)組用括號來表示,元素用"空格"符號分割開,語法格式如下:array_name=(value1...valuen)實(shí)例#!/bin/bash#author:菜鳥教程#url:?my_array=(AB"C"D)我們也可以使用下標(biāo)來定義數(shù)組:array_name[0]=value0array_name[1]=value1array_name[2]=value2讀取數(shù)組讀取數(shù)組元素值的一般格式是:${array_name[index]}實(shí)例#!/bin/bash#author:菜鳥教程#url:my_array=(AB"C"D)echo"第一個(gè)元素為:${my_array[0]}"echo"第二個(gè)元素為:${my_array[1]}"echo"第三個(gè)元素為:${my_array[2]}"echo"第四個(gè)元素為:${my_array[3]}"執(zhí)行腳本,輸出結(jié)果如下所示:$chmod+xtest.sh$./test.sh第一個(gè)元素為:A第二個(gè)元素為:B第三個(gè)元素為:C第四個(gè)元素為:D獲取數(shù)組中的所有元素使用@或*可以獲取數(shù)組中的所有元素,例如:#!/bin/bash#author:菜鳥教程#url:my_array[0]=Amy_array[1]=Bmy_array[2]=Cmy_array[3]=Decho"數(shù)組的元素為:${my_array[*]}"echo"數(shù)組的元素為:${my_array[@]}"執(zhí)行腳本,輸出結(jié)果如下所示:$chmod+xtest.sh$./test.sh數(shù)組的元素為:ABCD數(shù)組的元素為:ABCD獲取數(shù)組的長度#!/bin/bash#author:菜鳥教程#url:my_array[0]=Amy_array[1]=Bmy_array[2]=Cmy_array[3]=Decho"數(shù)組元素個(gè)數(shù)為:${#my_array[*]}"echo"數(shù)組元素個(gè)數(shù)為:${#my_array[@]}"執(zhí)行腳本,輸出結(jié)果如下所示:$chmod+xtest.sh$./test.sh數(shù)組元素個(gè)數(shù)為:4數(shù)組元素個(gè)數(shù)為:4Shell基本運(yùn)算符Shell和其他編程語言一樣,支持多種運(yùn)算符,包括:算數(shù)運(yùn)算符關(guān)系運(yùn)算符布爾運(yùn)算符字符串運(yùn)算符文件測試運(yùn)算符原生bash不支持簡單的數(shù)學(xué)運(yùn)算,但是可以通過其他命令來實(shí)現(xiàn),例如awk和expr,expr最常用。expr是一款表達(dá)式計(jì)算工具,使用它能完成表達(dá)式的求值操作。例如,兩個(gè)數(shù)相加(注意使用的是反引號`而不是單引號'):#!/bin/bashval=`expr2+2`echo"兩數(shù)之和為:$val"執(zhí)行腳本,輸出結(jié)果如下所示:兩數(shù)之和為:4兩點(diǎn)注意:表達(dá)式和運(yùn)算符之間要有空格,例如2+2是不對的,必須寫成2+2,這與我們熟悉的大多數(shù)編程語言不一樣。完整的表達(dá)式要被包含,注意這個(gè)字符不是常用的單引號,在Esc鍵下邊。算術(shù)運(yùn)算符下表列出了常用的算術(shù)運(yùn)算符,假定變量a為10,變量b為20:運(yùn)算符 說明 舉例+ 加法 expr$a+$b結(jié)果為30。- 減法 expr$a-$b結(jié)果為-10。* 乘法 expr$a\*$b結(jié)果為200。/ 除法 expr$b/$a結(jié)果為2。% 取余 expr$b%$a結(jié)果為0。= 賦值 a=$b將把變量b的值賦給a。== 相等。用于比較兩個(gè)數(shù)字,相同則返回true。 [b]返回false。!= 不相等。用于比較兩個(gè)數(shù)字,不相同則返回true。 [b]返回true。注意:條件表達(dá)式要放在方括號之間,并且要有空格,例如:[b]是錯(cuò)誤的,必須寫成[b]。實(shí)例算術(shù)運(yùn)算符實(shí)例如下:#!/bin/bash#author:菜鳥教程#url:a=10b=20val=`expr$a+$b`echo"a+b:$val"val=`expr$a-$b`echo"a-b:$val"val=`expr$a\*$b`echo"a*b:$val"val=`expr$b/$a`echo"b/a:$val"val=`expr$b%$a`echo"b%a:$val"if[$a==$b]thenecho"a等于b"fiif[$a!=$b]thenecho"a不等于b"fi執(zhí)行腳本,輸出結(jié)果如下所示:a+b:30a-b:-10a*b:200b/a:2b%a:0a不等于b注意:乘號(*)前邊必須加反斜杠()才能實(shí)現(xiàn)乘法運(yùn)算;if...then...fi是條件語句,后續(xù)將會講解。在MAC中shell的expr語法是:$((表達(dá)式)),此處表達(dá)式中的"*"不需要轉(zhuǎn)義符號"\"。關(guān)系運(yùn)算符關(guān)系運(yùn)算符只支持?jǐn)?shù)字,不支持字符串,除非字符串的值是數(shù)字。下表列出了常用的關(guān)系運(yùn)算符,假定變量a為10,變量b為20:運(yùn)算符 說明 舉例-eq 檢測兩個(gè)數(shù)是否相等,相等返回true。 [b]返回false。-ne 檢測兩個(gè)數(shù)是否相等,不相等返回true。 [b]返回true。-gt 檢測左邊的數(shù)是否大于右邊的,如果是,則返回true。 [b]返回false。-lt 檢測左邊的數(shù)是否小于右邊的,如果是,則返回true。 [b]返回true。-ge 檢測左邊的數(shù)是否大于等于右邊的,如果是,則返回true。 [b]返回false。-le 檢測左邊的數(shù)是否小于等于右邊的,如果是,則返回true。 [b]返回true。實(shí)例關(guān)系運(yùn)算符實(shí)例如下:#!/bin/bash#author:菜鳥教程#url:a=10b=20if[$a-eq$b]thenecho"$a-eq$b:a等于b"elseecho"$a-eq$b:a不等于b"fiif[$a-ne$b]thenecho"$a-ne$b:a不等于b"elseecho"$a-ne$b:a等于b"fiif[$a-gt$b]thenecho"$a-gt$b:a大于b"elseecho"$a-gt$b:a不大于b"fiif[$a-lt$b]thenecho"$a-lt$b:a小于b"elseecho"$a-lt$b:a不小于b"fiif[$a-ge$b]thenecho"$a-ge$b:a大于或等于b"elseecho"$a-ge$b:a小于b"fiif[$a-le$b]thenecho"$a-le$b:a小于或等于b"elseecho"$a-le$b:a大于b"fi執(zhí)行腳本,輸出結(jié)果如下所示:10-eq20:a不等于b10-ne20:a不等于b10-gt20:a不大于b10-lt20:a小于b10-ge20:a小于b10-le20:a小于或等于b布爾運(yùn)算符下表列出了常用的布爾運(yùn)算符,假定變量a為10,變量b為20:運(yùn)算符 說明 舉例! 非運(yùn)算,表達(dá)式為true則返回false,否則返回true。 [!false]返回true。-o 或運(yùn)算,有一個(gè)表達(dá)式為true則返回true。 [b-gt100]返回true。-a 與運(yùn)算,兩個(gè)表達(dá)式都為true才返回true。 [b-gt100]返回false。實(shí)例布爾運(yùn)算符實(shí)例如下:#!/bin/bash#author:菜鳥教程#url:a=10b=20if[$a!=$b]thenecho"$a!=$b:a不等于b"elseecho"$a!=$b:a等于b"fiif[$a-lt100-a$b-gt15]thenecho"$a小于100且$b大于15:返回true"elseecho"$a小于100且$b大于15:返回false"fiif[$a-lt100-o$b-gt100]thenecho"$a小于100或$b大于100:返回true"elseecho"$a小于100或$b大于100:返回false"fiif[$a-lt5-o$b-gt100]thenecho"$a小于5或$b大于100:返回true"elseecho"$a小于5或$b大于100:返回false"fi執(zhí)行腳本,輸出結(jié)果如下所示:10!=20:a不等于b10小于100且20大于15:返回true10小于100或20大于100:返回true10小于5或20大于100:返回false邏輯運(yùn)算符以下介紹Shell的邏輯運(yùn)算符,假定變量a為10,變量b為20:運(yùn)算符 說明 舉例&& 邏輯的AND [[Misplaced&b-gt100]]返回false|| 邏輯的OR [[b-gt100]]返回true實(shí)例邏輯運(yùn)算符實(shí)例如下:#!/bin/bash#author:菜鳥教程#url:a=10b=20if[[$a-lt100&&$b-gt100]]thenecho"返回true"elseecho"返回false"fiif[[$a-lt100||$b-gt100]]thenecho"返回true"elseecho"返回false"fi執(zhí)行腳本,輸出結(jié)果如下所示:返回false返回true字符串運(yùn)算符下表列出了常用的字符串運(yùn)算符,假定變量a為"abc",變量b為"efg":運(yùn)算符 說明 舉例= 檢測兩個(gè)字符串是否相等,相等返回true。 [b]返回false。!= 檢測兩個(gè)字符串是否相等,不相等返回true。 [b]返回true。-z 檢測字符串長度是否為0,為0返回true。 [-z$a]返回false。-n 檢測字符串長度是否為0,不為0返回true。 [-n$a]返回true。str 檢測字符串是否為空,不為空返回true。 [$a]返回true。實(shí)例字符串運(yùn)算符實(shí)例如下:#!/bin/bash#author:菜鳥教程#url:a="abc"b="efg"if[$a=$b]thenecho"$a=$b:a等于b"elseecho"$a=$b:a不等于b"fiif[$a!=$b]thenecho"$a!=$b:a不等于b"elseecho"$a!=$b:a等于b"fiif[-z$a]thenecho"-z$a:字符串長度為0"elseecho"-z$a:字符串長度不為0"fiif[-n$a]thenecho"-n$a:字符串長度不為0"elseecho"-n$a:字符串長度為0"fiif[$a]thenecho"$a:字符串不為空"elseecho"$a:字符串為空"fi執(zhí)行腳本,輸出結(jié)果如下所示:abc=efg:a不等于babc!=efg:a不等于b-zabc:字符串長度不為0-nabc:字符串長度不為0abc:字符串不為空文件測試運(yùn)算符文件測試運(yùn)算符用于檢測Unix文件的各種屬性。屬性檢測描述如下:操作符 說明 舉例-bfile 檢測文件是否是塊設(shè)備文件,如果是,則返回true。 [-b$file]返回false。-cfile 檢測文件是否是字符設(shè)備文件,如果是,則返回true。 [-c$file]返回false。-dfile 檢測文件是否是目錄,如果是,則返回true。 [-d$file]返回false。-ffile 檢測文件是否是普通文件(既不是目錄,也不是設(shè)備文件),如果是,則返回true。 [-f$file]返回true。-gfile 檢測文件是否設(shè)置了SGID位,如果是,則返回true。 [-g$file]返回false。-kfile 檢測文件是否設(shè)置了粘著位(StickyBit),如果是,則返回true。 [-k$file]返回false。-pfile 檢測文件是否是有名管道,如果是,則返回true。 [-p$file]返回false。-ufile 檢測文件是否設(shè)置了SUID位,如果是,則返回true。 [-u$file]返回false。-rfile 檢測文件是否可讀,如果是,則返回true。 [-r$file]返回true。-wfile 檢測文件是否可寫,如果是,則返回true。 [-w$file]返回true。-xfile 檢測文件是否可執(zhí)行,如果是,則返回true。 [-x$file]返回true。-sfile 檢測文件是否為空(文件大小是否大于0),不為空返回true。 [-s$file]返回true。-efile 檢測文件(包括目錄)是否存在,如果是,則返回true。 [-e$file]返回true。實(shí)例變量file表示文件"/var/www/runoob/test.sh",它的大小為100字節(jié),具有rwx權(quán)限。下面的代碼,將檢測該文件的各種屬性:#!/bin/bash#author:菜鳥教程#url:file="/var/www/runoob/test.sh"if[-r$file]thenecho"文件可讀"elseecho"文件不可讀"fiif[-w$file]thenecho"文件可寫"elseecho"文件不可寫"fiif[-x$file]thenecho"文件可執(zhí)行"elseecho"文件不可執(zhí)行"fiif[-f$file]thenecho"文件為普通文件"elseecho"文件為特殊文件"fiif[-d$file]thenecho"文件是個(gè)目錄"elseecho"文件不是個(gè)目錄"fiif[-s$file]thenecho"文件不為空"elseecho"文件為空"fiif[-e$file]thenecho"文件存在"elseecho"文件不存在"fi執(zhí)行腳本,輸出結(jié)果如下所示:文件可讀文件可寫文件可執(zhí)行文件為普通文件文件不是個(gè)目錄文件不為空文件存在Shellecho命令Shell的echo指令與PHP的echo指令類似,都是用于字符串的輸出。命令格式:echostring您可以使用echo實(shí)現(xiàn)更復(fù)雜的輸出格式控制。1.顯示普通字符串:echo"Itisatest"這里的雙引號完全可以省略,以下命令與上面實(shí)例效果一致:echoItisatest2.顯示轉(zhuǎn)義字符echo"\"Itisatest\""結(jié)果將是:"Itisatest"同樣,雙引號也可以省略3.顯示變量read命令從標(biāo)準(zhǔn)輸入中讀取一行,并把輸入行的每個(gè)字段的值指定給shell變量#!/bin/shreadnameecho"$nameItisatest"以上代碼保存為test.sh,name接收標(biāo)準(zhǔn)輸入的變量,結(jié)果將是:[root@www~]#shtest.shOK#標(biāo)準(zhǔn)輸入OKItisatest#輸出4.顯示換行echo-e"OK!\n"#-e開啟轉(zhuǎn)義echo"Ititatest"輸出結(jié)果:OK!Ititatest5.顯示不換行#!/bin/shecho-e"OK!\c"#-e開啟轉(zhuǎn)義\c不換行echo"Itisatest"輸出結(jié)果:OK!Itisatest6.顯示結(jié)果定向至文件echo"Itisatest">myfile7.原樣輸出字符串,不進(jìn)行轉(zhuǎn)義或取變量(用單引號)echo'$name\"'輸出結(jié)果:$name\"8.顯示命令執(zhí)行結(jié)果echo`date`注意:這里使用的是反引號`,而不是單引號'。結(jié)果將顯示當(dāng)前日期ThuJul2410:08:46CST2014Shellprintf命令上一章節(jié)我們學(xué)習(xí)了Shell的echo命令,本章節(jié)我們來學(xué)習(xí)Shell的另一個(gè)輸出命令printf。printf命令模仿C程序庫(library)里的printf()程序。printf由POSIX標(biāo)準(zhǔn)所定義,因此使用printf的腳本比使用echo移植性好。printf使用引用文本或空格分隔的參數(shù),外面可以在printf中使用格式化字符串,還可以制定字符串的寬度、左右對齊方式等。默認(rèn)printf不會像echo自動(dòng)添加換行符,我們可以手動(dòng)添加\n。printf命令的語法:printfformat-string[arguments...]參數(shù)說明:format-string:為格式控制字符串a(chǎn)rguments:為參數(shù)列表。實(shí)例如下:$echo"Hello,Shell"Hello,Shell$printf"Hello,Shell\n"Hello,Shell$接下來,我來用一個(gè)腳本來體現(xiàn)printf的強(qiáng)大功能:#!/bin/bash#author:菜鳥教程#url:printf"%-10s%-8s%-4s\n"姓名性別體重kgprintf"%-10s%-8s%-4.2f\n"郭靖男66.1234printf"%-10s%-8s%-4.2f\n"楊過男48.6543printf"%-10s%-8s%-4.2f\n"郭芙女47.9876執(zhí)行腳本,輸出結(jié)果如下所示:姓名性別體重kg郭靖男66.12楊過男48.65郭芙女47.99%s%c%d%f都是格式替代符%-10s指一個(gè)寬度為10個(gè)字符(-表示左對齊,沒有則表示右對齊),任何字符都會被顯示在10個(gè)字符寬的字符內(nèi),如果不足則自動(dòng)以空格填充,超過也會將內(nèi)容全部顯示出來。%-4.2f指格式化為小數(shù),其中.2指保留2位小數(shù)。更多實(shí)例:#!/bin/bash#author:菜鳥教程#url:#format-string為雙引號printf"%d%s\n"1"abc"#單引號與雙引號效果一樣printf'%d%s\n'1"abc"#沒有引號也可以輸出printf%sabcdef#格式只指定了一個(gè)參數(shù),但多出的參數(shù)仍然會按照該格式輸出,format-string被重用printf%sabcdefprintf"%s\n"abcdefprintf"%s%s%s\n"abcdefghij#如果沒有arguments,那么%s用NULL代替,%d用0代替printf"%sand%d\n"執(zhí)行腳本,輸出結(jié)果如下所示:1abc1abcabcdefabcdefabcdefabcdefghijand0printf的轉(zhuǎn)義序列序列 說明\a 警告字符,通常為ASCII的BEL字符\b 后退\c 抑制(不顯示)輸出結(jié)果中任何結(jié)尾的換行字符(只在%b格式指示符控制下的參數(shù)字符串中有效),而且,任何留在參數(shù)里的字符、任何接下來的參數(shù)以及任何留在格式字符串中的字符,都被忽略\f 換頁(formfeed)\n 換行\(zhòng)r 回車(Carriagereturn)\t 水平制表符\v 垂直制表符\ 一個(gè)字面上的反斜杠字符\ddd 表示1到3位數(shù)八進(jìn)制值的字符。僅在格式字符串中有效\0ddd 表示1到3位的八進(jìn)制值字符實(shí)例$printf"astring,noprocessing:<%s>\n""A\nB"astring,noprocessing:<A\nB>$printf"astring,noprocessing:<%b>\n""A\nB"astring,noprocessing:<AB>$printf"\a"$#不換行Shelltest命令Shell中的test命令用于檢查某個(gè)條件是否成立,它可以進(jìn)行數(shù)值、字符和文件三個(gè)方面的測試。數(shù)值測試參數(shù) 說明-eq 等于則為真-ne 不等于則為真-gt 大于則為真-ge 大于等于則為真-lt 小于則為真-le 小于等于則為真實(shí)例演示:num1=100num2=100iftest$[num1]-eq$[num2]thenecho'兩個(gè)數(shù)相等!'elseecho'兩個(gè)數(shù)不相等!'fi輸出結(jié)果:兩個(gè)數(shù)相等!代碼中的[]執(zhí)行基本的算數(shù)運(yùn)算,如:#!/bin/basha=5b=6result=$[a+b]#注意等號兩邊不能有空格echo"result為:$result"結(jié)果為:result為:11字符串測試參數(shù) 說明= 等于則為真!= 不相等則為真-z字符串 字符串的長度為零則為真-n字符串 字符串的長度不為零則為真實(shí)例演示:num1="ru1noob"num2="runoob"iftest$num1=$num2thenecho'兩個(gè)字符串相等!'elseecho'兩個(gè)字符串不相等!'fi輸出結(jié)果:兩個(gè)字符串不相等!文件測試參數(shù) 說明-e文件名 如果文件存在則為真-r文件名 如果文件存在且可讀則為真-w文件名 如果文件存在且可寫則為真-x文件名 如果文件存在且可執(zhí)行則為真-s文件名 如果文件存在且至少有一個(gè)字符則為真-d文件名 如果文件存在且為目錄則為真-f文件名 如果文件存在且為普通文件則為真-c文件名 如果文件存在且為字符型特殊文件則為真-b文件名 如果文件存在且為塊特殊文件則為真實(shí)例演示:cd/biniftest-e./bashthenecho'文件已存在!'elseecho'文件不存在!'fi輸出結(jié)果:文件已存在!另外,Shell還提供了與(-a)、或(-o)、非(!)三個(gè)邏輯操作符用于將測試條件連接起來,其優(yōu)先級為:"!"最高,"-a"次之,"-o"最低。例如:cd/biniftest-e./notFile-o-e./bashthenecho'至少有一個(gè)文件存在!'elseecho'兩個(gè)文件都不存在'fi輸出結(jié)果:至少有一個(gè)文件存在!Shell流程控制和Java、PHP等語言不一樣,sh的流程控制不可為空,如(以下為PHP流程控制寫法):<?phpif(isset($_GET["q"])){search(q);}else{//不做任何事情}在sh/bash里可不能這么寫,如果else分支沒有語句執(zhí)行,就不要寫這個(gè)else。ifelseifif語句語法格式:mandNfi寫成一行(適用于終端命令提示符):if[$(ps-ef|grep-c"ssh")-gt1];thenecho"true";fi末尾的fi就是if倒過來拼寫,后面還會遇到類似的。ifelseifelse語法格式:mandNelsecommandfiifelse-ifelseifelse-ifelse語法格式:ifcondition1thencommand1elifcondition2thencommand2elsecommandNfi以下實(shí)例判斷兩個(gè)變量是否相等:a=10b=20if[$a==$b]thenecho"a等于b"elif[$a-gt$b]thenecho"a大于b"elif[$a-lt$b]thenecho"a小于b"elseecho"沒有符合的條件"fi輸出結(jié)果:a小于bifelse語句經(jīng)常與test命令結(jié)合使用,如下所示:num1=$[2*3]num2=$[1+5]iftest$[num1]-eq$[num2]thenecho'兩個(gè)數(shù)字相等!'elseecho'兩個(gè)數(shù)字不相等!'fi輸出結(jié)果:兩個(gè)數(shù)字相等!for循環(huán)與其他編程語言類似,Shell支持for循環(huán)。for循環(huán)一般格式為:forvarinitem1item2...itemNmandNdone寫成一行:forvarinitem1item2...itemN;docommand1;command2…done;當(dāng)變量值在列表里,for循環(huán)即執(zhí)行一次所有命令,使用變量名獲取列表中的當(dāng)前取值。命令可為任何有效的shell命令和語句。in列表可以包含替換、字符串和文件名。in列表是可選的,如果不用它,for循環(huán)使用命令行的位置參數(shù)。例如,順序輸出當(dāng)前列表中的數(shù)字:forloopin12345doecho"Thevalueis:$loop"done輸出結(jié)果:Thevalueis:1Thevalueis:2Thevalueis:3Thevalueis:4Thevalueis:5順序輸出字符串中的字符:forstrin'Thisisastring'doecho$strdone輸出結(jié)果:Thisisastringwhile語句while循環(huán)用于不斷執(zhí)行一系列命令,也用于從輸入文件中讀取數(shù)據(jù);命令通常為測試條件。其格式為:whileconditiondocommanddone以下是一個(gè)基本的while循環(huán),測試條件是:如果int小于等于5,那么條件返回真。int從0開始,每次循環(huán)處理時(shí),int加1。運(yùn)行上述腳本,返回?cái)?shù)字1到5,然后終止。#!/bin/shint=1while(($int<=5))doecho$intlet"int++"done運(yùn)行腳本,輸出:12345使用中使用了Bashlet命令,它用于執(zhí)行一個(gè)或多個(gè)表達(dá)式,變量計(jì)算中不需要加上$來表示變量,具體可查閱:Bashlet命令。while循環(huán)可用于讀取鍵盤信息。下面的例子中,輸入信息被設(shè)置為變量FILM,按<Ctrl-D>結(jié)束循環(huán)。echo'按下<CTRL-D>退出'echo-n'輸入你最喜歡的網(wǎng)站名:'whilereadFILMdoecho"是的!$FILM是一個(gè)好網(wǎng)站"done運(yùn)行腳本,輸出類似下面:按下<CTRL-D>退出輸入你最喜歡的網(wǎng)站名:菜鳥教程是的!菜鳥教程是一個(gè)好網(wǎng)站無限循環(huán)無限循環(huán)語法格式:while:docommanddone或者whiletruedocommanddone或者for((;;))until循環(huán)until循環(huán)執(zhí)行一系列命令直至條件為true時(shí)停止。until循環(huán)與while循環(huán)在處理方式上剛好相反。一般while循環(huán)優(yōu)于until循環(huán),但在某些時(shí)候—也只是極少數(shù)情況下,until循環(huán)更加有用。until語法格式:untilconditiondocommanddonecondition一般為條件表達(dá)式,如果返回值為false,則繼續(xù)執(zhí)行循環(huán)體內(nèi)的語句,否則跳出循環(huán)。以下實(shí)例我們使用until命令來輸出0~9的數(shù)字:#!/bin/basha=0until[!$a-lt10]doecho$aa=`expr$a+1`done運(yùn)行結(jié)果:輸出結(jié)果為:0123456789caseShellcase語句為多選擇語句??梢杂胏ase語句匹配一個(gè)值與一個(gè)模式,如果匹配成功,執(zhí)行相匹配的命令。case語句格式如下:case值in模式1)mandN;;模式2)mandN;;esaccase工作方式如上所示。取值后面必須為單詞in,每一模式必須以右括號結(jié)束。取值可以為變量或常數(shù)。匹配發(fā)現(xiàn)取值符合某一模式后,其間所有命令開始執(zhí)行直至;;。取值將檢測匹配的每一個(gè)模式。一旦模式匹配,則執(zhí)行完匹配模式相應(yīng)命令后不再繼續(xù)其他模式。如果無一匹配模式,使用星號*捕獲該值,再執(zhí)行后面的命令。下面的腳本提示輸入1到4,與每一種模式進(jìn)行匹配:echo'輸入1到4之間的數(shù)字:'echo'你輸入的數(shù)字為:'readaNumcase$aNumin1)echo'你選擇了1';;2)echo'你選擇了2';;3)echo'你選擇了3';;4)echo'你選擇了4';;*)echo'你沒有輸入1到4之間的數(shù)字';;esac輸入不同的內(nèi)容,會有不同的結(jié)果,例如:輸入1到4之間的數(shù)字:你輸入的數(shù)字為:3你選擇了3跳出循環(huán)在循環(huán)過程中,有時(shí)候需要在未達(dá)到循環(huán)結(jié)束條件時(shí)強(qiáng)制跳出循環(huán),Shell使用兩個(gè)命令來實(shí)現(xiàn)該功能:break和continue。break命令break命令允許跳出所有循環(huán)(終止執(zhí)行后面的所有循環(huán))。下面的例子中,腳本進(jìn)入死循環(huán)直至用戶輸入數(shù)字大于5。要跳出這個(gè)循環(huán),返回到shell提示符下,需要使用break命令。#!/bin/bashwhile:doecho-n"輸入1到5之間的數(shù)字:"readaNumcase$aNumin1|2|3|4|5)echo"你輸入的數(shù)字為$aNum!";;*)echo"你輸入的數(shù)字不是1到5之間的!游戲結(jié)束"break;;esacdone執(zhí)行以上代碼,輸出結(jié)果為:輸入1到5之間的數(shù)字:3你輸入的數(shù)字為3!輸入1到5之間的數(shù)字:7你輸入的數(shù)字不是1到5之間的!游戲結(jié)束continuecontinue命令與break命令類似,只有一點(diǎn)差別,它不會跳出所有循環(huán),僅僅跳出當(dāng)前循環(huán)。對上面的例子進(jìn)行修改:#!/bin/bashwhil
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025北京同仁堂鄂爾多斯市藥店有限公司招聘10人考試核心題庫及答案解析
- 2025內(nèi)蒙古呼和浩特市敬業(yè)學(xué)校初中部招聘考試核心題庫及答案解析
- 2025年鐵路運(yùn)輸電子合同協(xié)議
- 2025山東勞動(dòng)職業(yè)技術(shù)學(xué)院(山東勞動(dòng)技師學(xué)院)招聘8人考試核心試題及答案解析
- 2025年碳足跡核算協(xié)議(咨詢)
- 貴州鋁業(yè)集團(tuán)2026高校畢業(yè)生招聘35人(一)參考考試試題及答案解析
- 2025年碳市場趨勢分析合同協(xié)議
- 2026河南許昌市兵役登記筆試重點(diǎn)題庫及答案解析
- 2026河南許昌市兵役登記考試核心題庫及答案解析
- 住宅空間照明設(shè)計(jì)
- 2025屆廣州市白云區(qū)三年級數(shù)學(xué)第一學(xué)期期末質(zhì)量跟蹤監(jiān)視試題含解析
- 2024版體育賽事贊助對賭協(xié)議合同范本3篇
- 《現(xiàn)代秘書思維》課件-現(xiàn)代秘書思維的應(yīng)用與提升
- 安全生產(chǎn)責(zé)任保險(xiǎn)事故預(yù)防技術(shù)服務(wù)評估考評評分細(xì)則
- 小學(xué)一年級下冊數(shù)學(xué)-期末樂考
- 2024版商品混凝土委托加工合同書范本
- DL5190.4-2019電力建設(shè)施工技術(shù)規(guī)范第4部分:熱工儀表及控制裝置
- 大氣道狹窄護(hù)理課件
- 2024年江蘇省海洋知識競賽備考試題庫(含答案)
- 晉中學(xué)院機(jī)械設(shè)計(jì)制造及其自動(dòng)化專業(yè)大一2018-2019學(xué)年機(jī)械制圖與計(jì)算機(jī)繪圖模擬題
- 萬科集團(tuán)財(cái)務(wù)管理制度手冊
評論
0/150
提交評論