1 條件選擇
html
1.1 if 語句
java
語法十分簡單web
#!/bin/bash MATH_SCORES="$1" NAME="$2" if [ -z "${MATH_SCORES}" ] then printf "The command requires that options have a scores.\n" printf "What's ths scores of your math? :" read MATH_SCORES fi if [ -z "${NAME}" ] then printf "The command requires that options have a student's name.\n" printf "What's your name? :" read NAME fi if [ "${NAME}" = "sunny" ] then printf "No, sunny is a teacher.\nPleae input your name,ok? " read NAME printf "My god,i think, you are bann sunny, excuse me.\n\n" else printf "\n" fi if [ "${MATH_SCORES}" -ge 90 ] then echo "Your scores is very good.Congratulations to you, ${NAME}." echo "I hope that you are't sunny." else if [ "${MATH_SCORES}" -ge 60 ] then echo "Congratulations. ${NAME}" elif [ "${MATH_SCORES}" -ge 50 ] then echo "Come on ${NAME}." else echo "What are you interested in? Please tell me, maybe i can help you, "${NAME}" ?" fi;fi echo [web@h p]$ ./if_then_else.sh 37 The command requires that options have a student's name. What's your name? :sunny No, sunny is a teacher. Pleae input your name,ok? sunny My god,i think, you are bann sunny, excuse me. What are you interested in? Please tell me, maybe i can help you, sunny ?
語句體,以fi結束。
shell
利用選擇語句判斷變量獲取成功與否bash
JAVA_PATH=`which java 2>/dev/null` if [ "x$JAVA_PATH" != "x" ]; then JAVA_PATH=`dirname $JAVA_PATH 2>/dev/null` JRE_HOME=`dirname $JAVA_PATH 2>/dev/null` fi
1.2 case 語句app
雙分號不能少;跟if同樣,語句體也須要結束符。ide
找工做時,根據應聘崗位不一樣,給出不一樣應徵者相應的聯繫人信息。
測試
#!/bin/bash echo -e "\v\tRecruitment Announcement" echo "Are you ready to apply for any job?" echo "1 accounting" echo "2 cashier" echo "3 secretary" echo -e "\vPlease enter a number to select the corresponding positions." read NUM case $NUM in 1) printf "call mr wang. number is 1124\n" ;; 2) printf "call miss li. number is 1233.\n" ;; 3) printf "call miss ji. number is 1367.\n" ;; *) printf "If you want to make a lot of money, to be a seller. call 1498.\n" ;; esac
在輸出交互信息時,使用了echo命令。當要格式化輸出時,須要來回調試。這裏僅僅爲了熟悉下case語句的語法,更好的方法在「cat」博文裏從新實現。
ui
使用case語句,處理座標移動的結果。
spa
#!/bin/bash echo $(date) X1=0 Y1=0 echo "L - turn left" echo "R - turn right" echo "U - turn up" echo "D - turn down" read INS case $INS in L) X1=$[${X1}-1] ;; R) X1=$[${X1}+1] ;; U) Y1=$[${Y1}+1] ;; D) Y1=$[${Y1}-1] ;; [[:lower:]]) printf "Uppers, please.\n" ;; *) ;; esac echo "x = ${X1} y = ${Y1}"
輸出腳本的幫助信息:
case "$1" in "") run_it ;; -r|--read) read_it ;; -v|--version) display_version ;; --clear) clear_TMPFILE ;; -h|--help) display_help ;; *) echo "findTom -h" display_help ;; esac
若是「"-v|--version"」,以雙引號表示,會出現意外。要是想用,就該這麼寫:「"-v"|"--version"」。
1.3 經過輯判斷實現條件測試
[view@file donatello]$ [ 3 -gt 5 ] && echo "true " || echo "false " false [view@file donatello]$ [ ! 3 -gt 5 ] && echo "true " || echo "false " true [work@file donatello]$ [ ! 3 -gt 5 ] && ( echo -n "true, "; echo "exit 0" ) || ( echo -n "false, "; echo "exit 1" ) true, exit 0 [work@file donatello]$ [ 3 -gt 5 ] && ( echo -n "true, "; echo "exit 0" ) || ( echo -n "false, "; echo "exit 1" ) false, exit 1
2 循環
2.1 for循環
語法格式:
for name[ [in [words…] ] ; ] do commands; done for ((expr1;expr2;expr3)) ; do commands; done
[web@h p]$ ls >> java.dir [web@h p]$ cat java.sh #!/bin/bash for i in $(cat java.dir) do echo $i done
計算1加到10
#!/bin/bash declare -i sum=0 for i in {1..10} do sum=$((sum+i)) done echo sum = $sum
#!/bin/bash sum=0 for i in $(seq 1 10) do sum=$((sum+i)) done echo sum = $sum
for 語句不帶列表,就從命令行獲取列表信息
[web@h p]$ cat t1.sh #!/bin/bash for i do echo $i done [web@h p]$ sh t1.sh ls ls [web@h p]$ sh t1.sh `ls`
類C風格(體如今「for」語句中、以及循環體中;變量不須要「$」符號)
#!/bin/bash SUM=0 MAX=100 MIN=0 for ((i=MIN; i<= MAX; i++)) do SUM=$[SUM+i] done echo "From ${MIN} add to ${MAX} is $SUM."
2.2 循環until、while
條件判斷時若是涉及了命令的返回值,該值無論返回了0仍是1之類,都須要跟數字比較來控制程序的運行。
#語法 until test-commands; do consequent-commands; done while test-commands; do consequent-commands; done
while循環是條件知足時開始執行;until循環是條件不知足時開始循環。
舉個例子,條件爲假時,才能執行循環體語句:
#!/bin/bash until false do echo -n '-' sleep 1 echo -e -n '\b\' sleep 1 echo -e -n '\b-' sleep 1 echo -e -n '\b/' sleep 1 echo -e -n '\b*' done
如果換做了條件知足時執行循環體語句的狀況,就能夠選擇while語句。
while還能夠直接讀取文件,在done語句處「done < /path/to/file」。查看系統默認掛載的特殊文件系統:
#!/bin/bash # while read LINE; do echo $LINE | grep -v dev &> /dev/null if [ $? -eq 0 ]; then echo $LINE | awk '{print $1}' | grep -v boot fi done < /etc/fstab
bash腳本調試
檢查腳本語法、調試執行腳本
$ bash -n adduser.sh $ bash -x adduser.sh
shell腳本追蹤
在測試腳本時,能夠使用set命令進行運行時的追蹤。在腳本中加入一行「set -x」;以「+」開頭的行,就是得到的追蹤內容(程序的執行過程)。
[root@right mag]# cat tes.sh #!/bin/bash set -x read -p "How old are you? " answer if [ $answer == "34" ]; then echo "Yes, very good." else echo "No, i don't want say anyting." fi exit 0 [root@right mag]# ./tes.sh + read -p 'How old are you? ' answer How old are you? 34 + '[' 34 == 34 ']' + echo 'Yes, very good.' Yes, very good. + exit 0 [root@right mag]# ./tes.sh + read -p 'How old are you? ' answer How old are you? 33 + '[' 33 == 34 ']' + echo 'No, i don'\''t want say anyting.' No, i don't want say anyting. + exit 0
看看沒有追蹤的執行過程:
[root@right mag]# ./tes.sh How old are you? 32 No, i don't want say anyting.