Decode360's Blog

          業精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 ::  :: 管理 ::
            302 隨筆 :: 26 文章 :: 82 評論 :: 0 Trackbacks
          四、while語句
          ?
          ??? shell中有三種循環語句,分別是while語句、for語句、until語句
          ?
          1、 while語句的格式為:
          ?
          ??? while 測試條件
          ??? do
          ??? 命令表
          ??? done
          ?
          ??? 說明:先執行測試條件,如果為真,則進入循環體執行其中的命令,然后再做條件測試,直到測試條件為假時終止循環。
          ?
          2、舉例1:
          ?
          ??? while [ $1 ]
          ??? do
          ????? if [ -f $1 ]
          ????? then echo "display:$1"
          ?????????? cat $1
          ????? else echo "$1 is not a file name."
          ????? fi
          ????? shift
          ??? done
          ?
          ??? 說明:程序對各個給定的位置參數,首先判斷是否為普通文件,是則先是內容,不是則報錯。每次循環一個位置,用shift移位,直至所有參數比較完成。
          ?
          3、舉例2:
          ?
          ??? echo "Key in file name -> \c"
          ??? read filename
          ??? echo "Key in data:"
          ??? while
          ????? read x
          ??? do
          ????? echo $x >> $filename
          ??? done
          ??? cat $filename
          ?
          ??? 說明:用戶輸入一個數據,就添加到指定的文件中,直到用戶按Enter鍵為止,最后顯示文件內容。
          ?
          ?
          五、until語句
          ?
          1、until語句的格式:
          ?
          ??? until 測試條件
          ??? do
          ????? 命令表
          ??? done
          ?
          ??? 說明:當測試條件為假時,才進入循環體,直至測試條件為真后終止循環。(跟while相反)
          ?
          2、舉例:
          ?
          ??? until [ "$2" = "" ]
          ??? do
          ????? cp $1 $2
          ????? shift 2
          ??? done
          ??? if [ "$1" != "" ]
          ??? then echo "bad argument!"
          ??? fi
          ?
          ??? 說明:如果第二個位置參數不為空,則將文件1復制給文件2,然后位置參數左移兩位,直至沒有第二個參數為止。在推出循環后再判斷第一個參數是否為空,若為空則報錯。
          ?
          ?
          六、for語句
          ?
          ??? for語句是最常用的循環結構語句,有兩種方式:值表方式和算數表達式方式。
          ?
          1、值表方式
          ?
          ??? 格式為:
          ??? for 變量 [ in 值表 ]; do 命令表; done
          ?
          ??? 例如:
          ??? for i in "${person[*]}"; do echo $i; done
          ?
          ??? 或者寫為:
          ??? for 變量 [ in 值表 ]
          ??? do
          ????? 命令名
          ??? done
          ??? 注:值表也可以是正則表達式
          ?
          ??? 示例:
          ??? dir=$1 ; shift
          ??? if [ -d $dir ]
          ??? then
          ????? cd $dir
          ????? for name
          ????? do
          ??????? if [ -f $name ]
          ??????? then cat $name
          ????????? echo "End of ${dir}/$name"
          ??????? else echo "Invalid file name :${dir}/$name"
          ??????? fi
          ????? done
          ??? else echo "Bad directory name :$dir"
          ??? fi
          ?
          ??? 說明:如果第一個位置參數是合法的目錄,則把后面各個位置參數對應的文件顯示出來,若文件名不正確則顯示錯誤信息。不過第一個位置參數不是合法目錄,則先是目錄名不對。
          ?
          2、算數表達式方式
          ?
          ??? 格式為:
          ??? for (( e1;e2;e3 )); do 命令表; done
          ?
          ??? 或者:
          ??? for (( e1;e2;e3 ))
          ??? do
          ????? 命令表
          ??? done
          ?
          ??? 舉例:
          ??? for (( i=1;i<=$1;i++ ))
          ??? do
          ????? for (( j=1;j<=i;j++ ))
          ????? do
          ??????? echo -n "*"
          ????? done
          ????? echo ""
          ??? done
          ??? echo "end!"
          ?
          ?
          七、其他命令
          ?
          1、break命令
          ?
          ??? break命令可以使我們手動控制跳出循環。
          ?
          ??? 其語法是:
          ??? break [n]
          ??? 其中n代表要跳出的循環層數,默認是1。若大于1,則從包含break語句的循環開始往外跳。
          ?
          ??? 舉例:
          ??? count=$#
          ??? cmd=echo
          ??? do
          ????? cmd="$cmd \$$count"
          ????? count=`expr $count -1`
          ????? if [ $count -eq 0 ]
          ????? then break
          ????? fi
          ??? done
          ??? eval $cmd
          ??? 說明:該循環總是為真,唯一的出口是執行break語句。
          ?
          2、continue語句
          ?
          ??? continue語句可以跳過循環體中后面的語句,直接回到本層循環的開頭,進行下一次循環。
          ?
          ??? 其語法是:
          ??? continue [n]
          ??? 其中n表示從包含continue語句的最內層循環開始向外跳的層數。默認值為1。
          ?
          ??? 舉例:
          ??? for i in 1 2 3 4 5
          ??? do
          ????? if [ "$i" -eq 3 ]
          ????? then continue
          ????? else echo "$i"
          ????? fi
          ??? done
          ??? 說明:不打印3。
          ?
          3、exit語句
          ?
          ??? exit語句用于立即退出正在執行的shell腳本。
          ?
          ??? 其語法為:
          ??? exit [n]
          ??? 其中n是設定的退出值。默認為最后一個命令的執行狀態。
          ?
          4、select語句
          ?
          ??? select語句一般用于菜單的設計,它自動完成接受用戶輸入的整個過程,顯示一組菜單項及用戶的選擇。
          ?
          ??? 其語法為:
          ??? select identifier[in word...]
          ??? do
          ????? 命令表
          ??? done
          ?
          ??? 舉例:
          ??? PS3="Choice?"
          ??? select choice in query add delete update list exit
          ??? do
          ????? case "$choice" in
          ????? query) echo "Call query routine"
          ???????????? break;;
          ????? add) echo "Call add routine"
          ?????????? break;;
          ????? delete) echo "Call delete routine"???
          ????????????? break;;
          ????? update) echo "Call update routine"
          ????????????? break;;
          ????? list) echo "Call list routine"
          ??????????? break;;
          ????? exit) echo "Call exit routine"
          ??????????? break;;
          ????? esac
          ??? done
          ??? echo "Your choice is:$choice"
          ?
          ??? 其運行結果為:
          ??? 1)query
          ??? 2)add
          ??? 3)delete
          ??? 4)update
          ??? 5)list
          ??? 6)exit
          ??? Choice? 2(用戶輸入)
          ??? Call add routine
          ??? Your choice is: add
          ?
          ??? 說明:列出1-6個選項菜單,給出提示接受用戶選擇。若in word省略,則默認按位置參數給定值。
          ?
          ?




          -The End-

          posted on 2009-01-12 22:06 decode360-3 閱讀(362) 評論(0)  編輯  收藏 所屬分類: Linux
          主站蜘蛛池模板: 博罗县| 昌吉市| 大埔县| 白河县| 海口市| 津市市| 陈巴尔虎旗| 东丽区| 淮滨县| 永登县| 襄垣县| 余姚市| 红安县| 西峡县| 五莲县| 红桥区| 喀喇沁旗| 沙河市| 新巴尔虎右旗| 晋城| 甘洛县| 佛冈县| 上饶县| 昌平区| 大理市| 余江县| 固安县| 理塘县| 嘉兴市| 贡觉县| 六盘水市| 江北区| 吉木萨尔县| 辛集市| 南乐县| 若尔盖县| 西乌| 克什克腾旗| 九龙坡区| 广南县| 桃园县|