流程控制(if,else,case,while,for,until)

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.



wKioL1cGr66w-JauAABm6P93Pb8520.jpg   

相關文章
相關標籤/搜索