1. 程式人生 > >結構化命令

結構化命令

環境變量 布爾 rec 表達式 屬組 var 備份 result cat

#--------------------條件判斷---------------------
#if-then 語句
    格式(可將換行換成;分隔)
        if  command    -- 和其他編程語言不一樣會執行if後面的命令,命令結束返回狀態碼為0才會執行then後的命令
        then  commands
        fi    -- 以fi結束
#if-then-else 語句
    格式
        if  command    
        then  commands
        else  commands    -- if命令返回狀態碼非0則執行else命令組
        fi
#嵌套if
    嵌套在if-then-else中的else語句中    
        if  command    
        then  commands
        else  commands    
            if command
            then commands
            else commands        -- 可以不使用else
            fi
        fi
    elif(else與if的合並,與直接嵌套if-then相比不能執行else語句)
        if  command    
        then  commands
        elif command
            then commands
        elif command
            then commands        
        elif command
            then commands
            else commands        -- 可以不使用else
        fi
    case(替代if-then-else對一個變量的多次判斷)
        變量variable與模式pattern匹配,則執行commands
            case  variable in
            pattern1 |  pattern2 )  commands1 ;;
            pattern3 )  commands2 ;;
            *)  default commands ;;
            esac
        例如:
            case $sw_cs in
            1 | 2) echo 1 or 2 ;;  -- |或者
            3) echo 3 ;;
            *) echo x ;;  -- 其他任意輸出x
            esac        -- 結束符
#解決if命令與其他編程語言不一致:測試test
    if test $my_variable
        if [ $val1 -gt 5 ] -- 使用[]內部兩端需要留空格,無須聲明test
        test支持三類測試
            test數值比較(只支持整數)
                n1 -eq n2    檢查 n1 是否與 n2 相等
                n1 -ge n2    檢查 n1 是否大於或等於 n2
                n1 -gt n2    檢查 n1 是否大於 n2
                n1 -le n2    檢查 n1 是否小於或等於 n2
                n1 -lt n2    檢查 n1 是否小於 n2
                n1 -ne n2    檢查 n1 是否不等於 n2
                如:if [ $val1 -gt 5 ]  -- 判斷變量val1的值是否大於5
            test字符串比較
                在比較字符串的相等性時,比較測試會將所有的標點和大小寫情況都考慮在內
                > 
< 符號需要轉義,否則會被識別成重定向(大寫字母的排序和sort排序不同,是根據ASCII值:小寫字母值更大) 通過-n,-z測試空字符串和未初始化變量 if [ -n $val1 ] -- 變量val1字符串長度是否非0 if [ -z $val1 ] -- 變量val1字符串長度是否為0,未初始化的變量默認為0 test文件比較 if [ -d /etc ] -- 檢查目錄 if [ -e /etc/passwd ] -- 檢查文件和目錄 if [ -f /etc/passwd ] -- 僅限文件檢查 if [ -r /etc/passwd ] -- 檢查文件或目錄是否可讀 if [ -w /etc/passwd ] -- 檢查文件或目錄是否可寫(屬組沒有權限編輯) if [ -x /etc/passwd ] -- 檢查文件或目錄是否可執行 if [ -s /etc/passwd ] -- 檢查文件或目錄是否未空 if [ -O /etc/passwd ] -- 檢查測試出你是否是文件或目錄的屬主 if [ -G /etc/passwd ] -- 檢查文件或目錄是否屬於默認組(不會檢查其他組) if [ /etc -nt /etc/passwd ] -- 檢查文件或目錄是否更新(系統目錄先於文件創建) if [ /etc -ot /etc/passwd ] -- 檢查文件或目錄是否更舊 復合條件測試:布爾運算符 if [ condition1 ] && [ condition2 ] -- AND布爾運算 if [ condition1 ] || [ condition2 ] -- OR布爾運算 if-then高級特性,替代test對數值和字符串的比較 if (( 5 ** 2
> 90 )) -- 數值比較使用雙括號。表達式算術符號不需要轉義。5的2次方 if [[ run == r* ]] -- 字符串比較使用雙方括號。判斷run是否是r開頭的字符串 #--------------------循環--------------------- #for命令 讀取列表中的值 格式 for var in list -- 變量var會自動聲明。 for 循環設定list的每個值都是用空格分割 do commands done 每次 for 命令遍歷值列表,它都會將列表中的下個值賦給 $test 變量 for test in 1 2 test do echo $test done -- 最後$test=test 處理空格和引號(單/雙)的情況 for test in I don\‘t know if "this‘ll" work "3 2 1" ‘o"k‘ do echo "word:$test" done -- 空格可使用單雙引號解決,引號可以使用相反引號或轉義解決 處理從變量讀取列 向變量中存儲的已有文本字符串尾部添加文本的常用方法:list=$list" run" for test in $list 從命令讀取值 echo $list list=sw_cs.sh -- 文件空格、制表符、換行都會識別為分隔符 for var in $(cat $list);do echo $var;done 更改字段分隔符(由 IFS 環境變量決定。默認:空格,制表符,換行符) 分隔符臨時更改需要備份 IFS_OLD=$IFS -- IFS的值是不可見的 IFS=$‘\n‘ -- 分隔符改成換行 IFS=$IFS_OLD -- 還原 多個分隔符賦值 IFS=‘\n‘:\; -- 賦值行串起來,分號需要轉義 用通配符讀取目錄 for file in /home/ly_ibas/* do if [ -d $file ] then echo $file is a d elif [ -f $file ] then echo $file is a r fi done C語言風格的for循環 for ((a=0;a
<9;a++)) do echo $a done 嵌套循環(for,while,until) 如: for (( a = 1; a <= 3; a++ )) do echo "Starting loop $a:" for (( b = 1; b <= 3; b++ )) do echo " Inside loop: $b" done done 循環處理文件數據: IFS.OLD=$IFS IFS=$‘\n‘ for entry in $(cat /etc/passwd) do echo "Values in $entry –" IFS=: for value in $entry do echo " $value" done done #while命令 格式: while test command -- while是if-then和for的結合 do other commands done 如:while echo $var1 [ $var1 -gt 0 ] -- 判斷var1是否大於0 do echo $var1 var1=$[ $var1 - 1 ] done #until(與while命令相反,狀態碼返回非0執行) 格式: until test command do other commands done 如:until echo $var1 [ $var1 -eq 0 ] do var1=$[ $var1 - 25 ] done #控制循環 break命令 -- 只能跳出一層循環 跳出單個循環(跳出for,while,until) for var1 in 1 2 3 4 5 6 7 8 9 10 do if [ $var1 -eq 5 ] then break fi echo "Iteration number: $var1" done -- 1 2 3 4 var1=1 while [ $var1 -lt 10 ] -- 判斷是否小於10 do if [ $var1 -eq 5 ] then break fi echo "Iteration: $var1" var1=$[ $var1 + 1 ] done 跳出內部循環 for (( a = 1; a < 4; a++ )) do echo "Outer loop: $a" for (( b = 1; b < 100; b++ )) do if [ $b -eq 5 ] then break fi echo " Inner loop: $b" done done 跳出外部循環 -- break n,默認n=1跳出當前循環,n代表層級 for (( a = 1; a < 4; a++ )) do echo "Outer loop: $a" for (( b = 1; b < 100; b++ )) do if [ $b -gt 4 ] then break 2 -- 當n=2跳出外層循環,當n=3跳出再外層循環 fi echo " Inner loop: $b" done done continue命令 -- 不完全跳出循環 for (( var1 = 1; var1 < 15; var1++ )) do if [ $var1 -gt 5 ] && [ $var1 -lt 10 ] then continue fi echo "Iteration number: $var1" done -- 1 2 3 4 5 10 11 12 13 14 for (( a = 1; a <= 5; a++ )) do echo "Iteration $a:" for (( b = 1; b < 3; b++ )) do if [ $a -gt 2 ] && [ $a -lt 4 ] then continue 2 -- 跳出繼續執行外層循環 fi var3=$[ $a * $b ] echo " The result of $a * $b is $var3" done done -- a=3未執行內存循環,外部循環a=4繼續執行 #處理循環輸出(> |) for file in /home/rich/* do if [ -d "$file" ] then echo "$file is a directory" elif echo "$file is a file" fi done > sw_cs

結構化命令