1. 程式人生 > >Linux Shell筆記之結構迴圈

Linux Shell筆記之結構迴圈

一、條件語句
1.if—then
#!/bin/bash
if date              如果命令執行成功(退出碼為0),則then部分的命令被執行
then
   echo "good"
fi

2.if—then—else
#!/bin/bash
if hunter
then
   echo "good"
else 
   echo "bad"        if語句中退出碼非0,則執行else部分語句
fi

3.elif
#!/bin/bash
if hunter
then
   echo "command not found"
elif date            多重If判斷
then
   echo "date"
fi

4.test命令           與其它程式語言思維一樣的方式
#!/bin/bash
if test 1 -eq 2      test命令列出條件成立則退出並返回狀態碼0,命令等同if [ 1 -eq 2]
then
   echo "right"
else
   echo "wrong"
fi

5.條件比較
1)資料比較
n1 -eq n2            相等
n1 -ge n2            大於或等於
n1 -gt n2             大於
n1 -le n2             小於等於
n1 -lt n2              小於
n1 -ne n2            不等於
2)字串比較
str1 = str2
str1 != str2
str1 < str2
str1 > str2
-n str1              檢查str1的長度是否非0
-z str1              檢查str1的長度是否為0

#!/bin/bash
str1=good
str2=wrong
if [ $str1 \> $str2 ]          大於號需要轉義,否則指令碼會當重定向符號
then echo "$str1 is greater than $str2"
else
   echo "$str1 is less than $str2"
fi

#!/bin/bash
str=
if [ -z "$str" ]               判斷字串是否為空,空的或未初始化的變數對Shell指令碼很致命
then 
   echo "empty"
else
   echo "not empty"
fi

3)檔案比較
-d file                檢查檔案是否存在且為目錄
-e file                檢查檔案是否存在
-f file                 檢查檔案是否存在且為檔案
-r file                 檢查檔案是否存在且可讀
-s file                檢查檔案是否存在且非空
-w file               檢查檔案是否存在且可寫
-x file                檢查檔案是否存在且可執行
-O file               檢查檔案是否存在且屬當前使用者
-G file               檢查檔案是否存在且預設組與當前使用者相同
file1 -nt file2       檢查file1是否新於file2
file1 -ot file2       檢查file1是否舊於file2


4)複合條件&&與、||或
#!/bin/bash
if [ -e str ] && [ -f zero ]
then
   echo "file all exist"
fi

5)雙圓括號
#!/bin/bash
str1=good
str2=wrong
if (( $str1 > $str2 ))        雙圓括號中表達式裡的大於號不用轉義
then echo "$str1 is greater than $str2"
else
   echo "$str1 is less than $str2"
fi

6)雙方括號
#!/bin/bash
if [[ $USER == r* ]]          支援萬用字元模式
then
   echo "welcome root user"
else
   echo "sorry"
fi

7)case分支
#!/bin/bash
case $USER in
root|hunterno4)
   echo "welcome root user";;           尾部兩個分號
mysql)
   echo "welcome to database";;
surfftp)
   echo "nice to meet you";;
*)                                      都不匹配時的default語句
   echo "i don't know you";;
esac

二、迴圈語句

1.for命令
1)for迴圈
#!/bin/bash
for command in `ls /bin`                 for迴圈預設每個值以空格來分割
do 
   echo "command in /bin is $command"
done

#!/bin/bash
for file in /usr/local/program/package/*
do
   if [ -d "$file" ]                     檔案用引號圈起,以避免檔案含空格等情況
   then
      echo "$file is a directory"
   elif [ -f "$file" ]
   then
      echo "$file is a file"
   fi
done

2)欄位分隔符
#!/bin/bash
IFS.OLD=$IFS                              
IFS=$'\n'                                 修改IFS分隔符為換行符,也可同時賦值為:;"等等
for str in `cat /home/hunterno4/passwd`
do
  echo "str in passwd is $str"
done
IFS=$IFS.OLD                              恢復IFS分隔符預設值

3)C語言風格的for迴圈
#!/bin/bash
for ((i = 0;i<5 ;i++))                    此時變數與值間可以有空格,變數不用加$號
do
  echo "current number is $i"
done

2.while命令
#!/bin/bash
i=5
while [ $i -gt 0 ]
do
   echo $i
   i=$[ $i-1 ]
done

3.巢狀迴圈
#!/bin/bash
IFS.OLD=$IFS
IFS=$'\n'
for row in `cat /etc/passwd`
do
   echo "passwd row in $row ———"
   IFS=$':'
   for words in $row
   do
      echo " $words"
   done
done
IFS=$IFS.OLD

4.迴圈控制
1)break
#!/bin/bash
i=5
while [ $i -gt 0 ]
do
   echo $i
   i=$[ $i-1 ]
   if [ $i -eq 3 ]
   then
      break                       自動終止最裡面的迴圈,break n,終止n層迴圈
   fi
done

2)continue
#!/bin/bash
i=10
while [ $i -gt 0 ]
do 
   i=$[ $i-1 ]
   if [ $i -gt 3 ] && [ $i -lt 6 ]
   then
      continue                    continue n則指定繼續執行哪級迴圈
   fi
   echo "$i"
done > output.txt                 將迴圈過程中的結果重定向輸出到檔案