| 引用: |
| 一、用戶(hù)登陸進(jìn)入系統后的系統環(huán)境變量: $HOME 使用者自己的目錄 $PATH 執行命令時(shí)所搜尋的目錄 $TZ 時(shí)區 $MAILCHECK 每隔多少秒檢查是否有新的信件 $PS1 在命令列時(shí)的提示號 $PS2 當命令尚未打完時(shí),Shell 要求再輸入時(shí)的提示號 $MANPATH man 指令的搜尋路徑 二、特殊變量: $0 這個(gè)程序的執行名字 $n 這個(gè)程序的第n個(gè)參數值,n=1..9 $* 這個(gè)程序的所有參數 $# 這個(gè)程序的參數個(gè)數 $$ 這個(gè)程序的PID $! 執行上一個(gè)指令的PID $? 執行上一個(gè)指令的返回值 三、shell中的變元: * 任意字符串 一個(gè)任意字符 [abc] a, b, c三者中之一 [a-n] 從a到n的任一字符 四、幾個(gè)特殊字符表示 \b 退回 \c 打印一行時(shí)沒(méi)有換行符 這個(gè)我們經(jīng)常會(huì )用到 \f 換頁(yè) \r 回車(chē) \t 制表 \v 垂直制表 \\ 反斜線(xiàn)本身 五、判斷文件的屬性 格式:-操作符 filename -e 文件存在返回1, 否則返回0 -r 文件可讀返回1,否則返回0 -w 文件可寫(xiě)返回1,否則返回0 -x 文件可執行返回1,否則返回0 -o 文件屬于用戶(hù)本人返回1, 否則返回0 -z 文件長(cháng)度為0返回1, 否則返回0. -f 文件為普通文件返回1, 否則返回0 -d 文件為目錄文件時(shí)返回1, 否則返回0 六、測試字符串 字符串1 = 字符串2 當兩個(gè)字串相等時(shí)為真 字符串1 != 字符串2 當兩個(gè)字串不等時(shí)為真 -n 字符串 當字符串的長(cháng)度大于0時(shí)為真 -z 字符串 當字符串的長(cháng)度為0時(shí)為真 字符串 當串字符串為非空時(shí)為真 七、測試兩個(gè)整數關(guān)系 數字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、< ,>,*,?,[,] 下面我一一舉列說(shuō)明 一、$符號 1、echo $? 顯示的是上一條指令退出狀態(tài) 2、echo "$?" 效果同上 3、echo ‘$?‘ 顯示的是$? 4、echo \$? 顯示的是$? 5、echo "\$?" 顯示的是$? 大家可能已經(jīng)看出 $符號在雙引號中具有特殊意義 雙引號對$符號不起作用 而單引號可以將特殊字符的的特殊意義屏蔽掉,使其能顯示為字符本身,反斜 杠也可以將特殊字符的特殊含義屏蔽掉,使特殊字符失去特殊含義。 二、\ 反斜杠 反斜杠的作用是將特殊符號字符的特殊含義屏蔽掉,使其還是原字符 A=1234 echo \$A 顯示為$A 如果不加\將顯示為1234 echo \` 顯示為` echo \" 顯示為雙引號 echo \\ 顯示為\ 三、` 反引號 反引號的功能是命令替換,將反引號中的字符串做為命令來(lái)執行,我們在用shell編程時(shí)經(jīng)常用的到 將系統命令的執行結果賦給一個(gè)變量 A=`date` echo $A 顯示的不是date而是當時(shí)的時(shí)間串 比如有一文件A的內容如下 ABCDEFG 1234456 abcdefg B=`cat A|grep 234` # 檢索文件A中含有字符串234的行 echo $B 將顯示為1234456 echo "$B" 將顯示為什么? echo "\$B" 將顯示為什么?讀者自己試試 四、" 雙引號 在系統中有些特殊字符,為避免引用這些特殊字符 往往用雙引號或單引號將這些特殊字符引起來(lái),使其不具有特殊含義。 但有一部分特殊字符在引號中還是具有特殊含義,用雙引號引起來(lái)是不起作用的。本文中所列的前四個(gè)特殊字符在雙引號中還是特殊字符。為了使其不具有特殊含義一是用單引號引進(jìn)來(lái)二是用\反斜線(xiàn)使其失去作用。 比如我們想原樣輸出這些特殊字符 echo """ echo "$" echo "\" echo "`" 以上不是你所期望的結果,因為雙引號對它們不起作用,你只能這樣才能輸出這些特殊字符的原形 echo ‘"‘ echo ‘$‘ echo ‘\‘ echo ‘`‘ 或 echo "\"" echo "\$" echo "\\" echo "\`" 將分別顯示為 " $ \ ` 五、其它特殊字符 大家注意到 除了前四個(gè)特殊字符外 我將其它的特殊字符都放在一塊,這是因為前四個(gè)特殊字符在雙引號中還是具有特殊含義,所以單獨拿出來(lái)講,除此以外的特殊字符如果你要輸出這些特殊字符的原形,你就可以用雙引號或單引號引起來(lái)使其失去特殊含義。 < ,>,*,?,[,]對shell有特殊含義 但你可以用雙引號引起來(lái)輸入這些原形 講了這么多大家是不是已經(jīng)注意到所有的特殊字符在單引號中失去特殊含義,如果你要輸出特殊字符原形但又記不清那些特殊字符在雙引號中不能輸出原形,建議你干脆用單引號引起來(lái)。 今天介紹條件測試語(yǔ)句 一、if 條件語(yǔ)句 格式: if 條件表達式 then #當條件為真時(shí)執行以下語(yǔ)句 命令列表 else #為假時(shí)執行以下語(yǔ)句 命令列表 fi if 語(yǔ)句也可以嵌套使用 if 條件表達式1 then if 條件表達式2 then 命令列表 else if 條件表達式3 then 命令列表 else 命令列表 fi fi else 命令列表 fi 你可以進(jìn)行多層嵌套 一個(gè)if語(yǔ)句一定要跟一個(gè)fi 表示該層條件結束 否則會(huì )造成語(yǔ)法錯誤 結合前面講的 舉例如下: 這里先講一個(gè)條件語(yǔ)句中用到的命令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 以上的例子不知您是否看懂是什么意思嗎? 假如我們現在將這個(gè)例子保存為prfile chmod +x prfile 執行剛才的程序 ./prfile aaa 這個(gè)例子是檢查你的輸入的參數是否是一個(gè)文件 如果是就打印 如果是一個(gè)目錄 先轉目錄再打印 如果即不是文件也不是目錄給出提示 二、多重條件測試語(yǔ)句case 格式: case 字串 in 模式) 命令列表;; 模式) 命令列表;; .... esac 多重條件語(yǔ)句是以case 開(kāi)始以esac結束 中間可以有多個(gè)條件列表 功能是測試字串和和里面的模式有沒(méi)有匹配的,有就執行里面的命令列表 模式也可以是*號 表示任意字串,每個(gè)模式里面的最后要心;;雙引號結束,否則會(huì )發(fā)生語(yǔ)法錯誤。 現舉例如下: case $1 in *.c) cc $1 ;; *.txt) lpr $1 ;; *) echo "未知的類(lèi)型" esac 假如將以上內容保存在文件abc中 chmod +x abc 執行 ./abc a.c 將會(huì )對文件a.c進(jìn)行編譯 執行 ./abc readme.txt 將會(huì )把文件通過(guò)打印機 假如我將以上內容改一下,你是否會(huì )知道它的執行結果? case $1 in *) cc $1 ;; *.txt) lpr $1 ;; *.c) echo "未知的類(lèi)型" esac 今天介紹循環(huán)語(yǔ)句 一. while 循環(huán) while 命令格式 while 條件表 do 命令表 done 執行過(guò)程 shell首先執行條件表,如果條件表的最后一條語(yǔ)句的退出狀態(tài)為零,則執行盾環(huán)體內的命令 表,執行完后,再檢查條件表,如果退出狀態(tài)為零將繼續執行,如此循環(huán)往復直到條件表的 最后一條語(yǔ)句的退出狀態(tài)非零. 退出狀態(tài)為零就是條件為真True. 舉例說(shuō)明 假如shell文件的內容如下: Sum=0 i=0 while true #true是系統的關(guān)鍵詞 表示真 do i=`expr $i + 1` Sum=`expr $Sum + $i` if [ $i = "100" ] then break; fi done echo $i $Sum 最后這個(gè)程序顯示的是 100 5050 這個(gè)程序的運算就是將1到100加起來(lái) 下面將這個(gè)程序再改動(dòng)一下 Sum=0 i=0 while [ $i != "100" ] do i=`expr $i + 1` Sum=`expr $Sum + $i` done echo $i $Sum 改動(dòng)后的程序運算結果和上面是一樣 但程序比上面的要簡(jiǎn)練 在這個(gè)循環(huán)中還可以以until做為測試條件 它正好與while測試的條件相反,也就是當條件為假時(shí)將繼續執行循環(huán)體內的語(yǔ)句,否則就退出循環(huán)體,下面還用這個(gè)例子. Sum=0 i=0 until [ $i = "100" ] do i=`expr $i + 1` Sum=`expr $Sum + $i` done echo $i $Sum 當i不等于100時(shí)循環(huán) 就是當條件為假時(shí)循環(huán),否則就退出,而第一個(gè)例子是當i不等于100 時(shí)循環(huán),也就是測試條件為真時(shí)循環(huán). 二.for 循環(huán) 命令格式: for 變量 in 名字列表 do 命令列表 done 這里的名字列表是一個(gè)由空格分隔的字符串列表,shell在執行for循環(huán)時(shí)每次依次從名字表 中取出一個(gè)字符串賦給循環(huán)變量作為變量的值. 在寫(xiě)for語(yǔ)句時(shí),也可以省略in 名字列表部分,這表示用當前的位置參數來(lái)代替這時(shí)的名 字列表. 下面舉個(gè)例子 比如在你的電腦中有兩個(gè)目錄,一個(gè)是aa,一個(gè)是bb在這兩個(gè)目錄中有5個(gè)相同的文件,但其 中一個(gè)目錄中的一個(gè)或多個(gè)文件剛剛修改過(guò),現在我忘記剛才改的是那幾個(gè)文件 了,那么我靠梢員冉弦幌掄飭礁瞿柯嫉奈募橢懶?程序如下: for File in a1 a2 a3 a4 a5 do diff aa/$File bb/$File done 下面再舉一個(gè)不帶名字列表的例子 for File do echo $Filw done 文件內容保存在a.sh中 并可執行 我們在執行這個(gè)shell程序時(shí)命令行如下: a.sh a1 a2 a3 a4 a5 執行結果如下: a1 a2 a3 a4 a5 大家從這個(gè)例子中可以看到命令行的參數被逐一讀入一次 三.循環(huán)控制語(yǔ)句 break 命令不執行當前循環(huán)體內break下面的語(yǔ)句從當前循環(huán)退出. continue 命令是程序在本循體內忽略下面的語(yǔ)句,從循環(huán)頭開(kāi)始執行. 一,命令組合:圓括號和花括號 shell中有兩種方法將命令組合在一起:圓括號和花括號.圓括號使shell創(chuàng )建一個(gè)子shell 來(lái)讀取并執行括起來(lái)的名命令.左括號和右括號不論出現在命令行中的什么位置,shell都會(huì ) 認為它們具有特殊的組合意義的.只有用雙引號將它們括起來(lái)引用,才表示圓括號或花括號 的原義.例如: echo a(b) 將出現語(yǔ)法上的錯誤,要想輸出a(b)字符串 只能括起來(lái) echo "a(b)" 或echo a"("b")" 這樣才能被shell正確解釋. 利用組合命令有什么作用呢? 一,用圓括號組合命令 圓括號的組合命令可以創(chuàng )建子進(jìn)程運行組合程序,建立子進(jìn)程的功能是很有用的,因為 子shell在組合命令中的種種操作都不會(huì )影響到當前shell的各變量的值. 例如: 子進(jìn)程在執行組合命令時(shí)改變了工作目錄,并在新的工作目錄下執行一系例命令,執行 完后它可以不必返回原工作目錄,因為子進(jìn)程工作目錄的改變不會(huì )影響到當前工作目錄. 創(chuàng )建子進(jìn)程后將當前的環(huán)境也同樣傳給子shell,當前shell中用export輸出到環(huán)境中的 各變量在子shell中同樣有效. 花括號也可以將命令組合在一起.左 右花括號只有作為一條命令的第一個(gè)字出現時(shí), shell才它們含有特殊含義. 與圓括號不同的是花括號并不創(chuàng )建子shell,只是由當前的shell來(lái)讀取并執行括起來(lái)的 命令.有時(shí)用戶(hù)希望使用一組命令的順序輸出作為另一組命令的輸入,此時(shí)用花括號是很方 便的. 不論是用圓括號不是花括號,退出狀態(tài)都是等于最后一條括起來(lái)的命令的退出狀態(tài). 二,可以在當前shell中執行的命令 用戶(hù)在使用shell時(shí)一定要了解那些是可以在當前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 : {} |
聯(lián)系客服