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.