引用:
一、用戶登陸進入系統後的系統環境變數: $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的任一字元 四、幾個特殊字元表示 退回 c 列印一行時沒有換行符 這個我們經常會用到 f 換頁
回車 製表 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 : {}

推薦閱讀:

查看原文 >>
相关文章