2018-4-18 17周1次課 shell邏輯判斷、文件目錄屬性判斷、if、case
·格式1:if 條件; then 語句; fi
例:a=5
if [ $a -gt 3 ]; then echo ok; fi
[root@localhost shell]# sh if1.sh ok
·格式2:if 條件; then 語句; else 語句; fi
例:a=5
if [ $a -gt 3 ]; then echo ok; else echo nook; fi
[root@localhost shell]# sh if1.sh ok
[root@localhost shell]# sh if1.sh not ok [root@localhost shell]# sh -x if1.sh + a=2 + '[' 2 -gt 3 ']' + echo not ok not ok
·格式3:if …; then … ;elif …; then …; else …; fi
第一個條件,怎樣;第二個條件,怎樣;。。。否則,其他條件
[root@localhost shell]# sh -x if1.sh + a=3 + '[' 3 -gt 4 ']' + '[' 3 -lt 6 ']' + echo '<6 && >1' <6 && >1
[root@localhost shell]# sh -x if1.sh + a=5 + '[' 5 -lt 4 ']' + '[' 5 -gt 6 ']' + echo not ok not ok
·邏輯判斷表達式:
if [ $a -gt $b ]; -gt (>); 大於
if [ $a -lt 5 ]; -lt(<); 小於
if [ $b -eq 10 ]等 -eq(==); 等於
-le(<=);-ge(>=); -ne(!=) 註意到處都是空格
·如果非要用 > < ,可以用(( ))
[root@localhost shell]# if (($a>1));then echo ok;fi
ok
·可以使用 && || 結合多個條件
·if [ $a -gt 5 ] && [ $a -lt 10 ]; then 並且
·if [ $b -gt 5 ] || [ $b -lt 3 ]; then 或者
20.6 文件目錄屬性判斷
·[ -f file ] 判斷是否是普通文件,且存在
·[ -d file ] 判斷是否是目錄,且存在
·[ -e file ] 判斷文件或目錄是否存在
·[ -r file ] 判斷文件是否可讀
·[ -w file ] 判斷文件是否可寫
·[ -x file ] 判斷文件是否可執行
·[ -f file ] 判斷是否是普通文件,且存在
[root@localhost ~]# sh -x file1.sh + f=/tmp/alex + '[' -f /tmp/alex ']' ##是否存在且是文件 + touch /tmp/alex##不存在則創建 [root@localhost ~]# sh -x file1.sh + f=/tmp/alex + '[’ -f /tmp/alex ']' ##是否存在且是文件 + echo /tmp/alex exist ##顯示存在 /tmp/alex exist
·[ -d file ]判斷是否是目錄,且存在
[root@localhost ~]# sh -x file2.sh + f=/tmp/alex + '[' -d /tmp/alex ']' + touch /tmp/alex [root@localhost ~]# sh -x file2.sh + f=/tmp/alex + '[' -d /tmp/alex ']' + touch /tmp/alex
·[ -e file ]判斷文件或目錄是否存在
[root@localhost ~]# sh -x file2.sh + f=/tmp/alex + '[' -e /tmp/alex ']' + echo /tmp/alex exist /tmp/alex exist
·[ -r file ]判斷文件是否可讀
[root@localhost shell]# sh file2.sh /tmp/alex readable
·[ -w file ]判斷文件是否可寫
[root@localhost shell]# sh file2.sh /tmp/alex writeable
·[ -x file ]判斷文件是否可執行
[root@localhost ~]# sh file2.sh [root@localhost ~]# ll /tmp/alex -rw-r--r-- 1 root root 0 4月 18 21:21 /tmp/alex #!/bin/bash f="/tmp/alex" if [ -f $f ] then rm -f $f fi
可以不用if判斷,寫成
#!/bin/bash f="/tmp/alex" [ -f $f ] && rm -f $f
#!/bin/bash f="/tmp/alex" if [ -f $f ] then rm -f $f else touch $f fi
原腳本可取反寫為
#!/bin/bash f="/tmp/alex" if [ ! -f $f ] then touch $f fi
可以不用if判斷,寫成
#!/bin/bash f="/tmp/alex" [ -f $f ] || touch $f
20.7 if特殊用法
·if [ -z "$a" ] 這個表示當變量a的值為空時會怎麽樣(變量要加引號,文件不用引號)
可優化為
[root@localhost shell]# sh -x file3.sh ++ wc -l /tmp/jojo wc: /tmp/jojo: 沒有那個文件或目錄 + n= + '[' -z '' ']' + echo not exist not exist
可以再優化為
[root@localhost shell]# sh -x file3.sh ++ wc -l /tmp/jojo wc: /tmp/jojo: 沒有那個文件或目錄 + n= + '[' -f ']' + echo ' not exist.' not exist. + exit
·if [ -n "$a" ] 表示當變量a的值不為空
[root@localhost shell]# echo $b [root@localhost shell]# if [ -n 01.sh ];then echo ok;fi ok [root@localhost shell]# if [ -n "$b" ];then echo "$b";else echo "b is null";fi b is null
·if grep -q '123' 1.txt; then 表示如果1.txt中含有'123'的行時會怎麽樣
[root@localhost shell]# if grep -w "user1" /etc/passwd;then echo "user1 exist";fi user1:x:1011:1011::/home/user1:/bin/bash user1 exist [root@localhost shell]# if grep -wq "user1" /etc/passwd;then echo "user1 exist";fi user1 exist ##grep -q 靜默輸出 [root@localhost shell]# if ! grep -wq "user2" /etc/passwd;then useradd user2;fi
·if [ ! -e file ]; then 表示文件不存在時會怎麽樣
·if (($a<1)); then …等同於 if [ $a -lt 1 ]; then…
·[ ] 中不能使用<,>,==,!=,>=,<=這樣的符號
20.8/20.9 case判斷
·格式: case 變量名 in
value1)
command
;;
value2)
command
;;
*)
commond
;;
esac
::表示一個判斷結束,進入下一個判斷
·在case程序中,可以在條件中使用|,表示或的意思, 比如
2|3)
command
;;
· *)除以上所有之外的
·shell腳本案例
#!/bin/bash read -p "Please input a number: " n ##從標準輸入讀取輸入並賦值給變量 n if [ -z "$n" ] then echo "Please input a number." exit 1##1是退出時的提示符 fi n1=`echo $n|sed 's/[0-9]//g'` ##從變量n中將數字替換為空,如果n1不為空,則不是純數字,那麽現實輸入一個數字並退出 if [ -n "$n1" ] then echo "Please input a number." exit 1 fi if [ $n -lt 60 ] && [ $n -ge 0 ] ##純數字往下接著判斷 then tag=1 ##標記tag elif [ $n -ge 60 ] && [ $n -lt 80 ] then tag=2 elif [ $n -ge 80 ] && [ $n -lt 90 ] then tag=3 elif [ $n -ge 90 ] && [ $n -le 100 ] then tag=4 else tag=0 fi case $tag in 1) echo "不及格" ;; 2) echo "及格" ;; 3|4) echo "優秀" ;; *) echo "The number range is 0-100." ;; esac
·執行查看結果:
[root@localhost shell]# sh -x case.sh + read -p 'Please input a number: ' n Please input a number: 77 + '[' -z 77 ']' ++ echo 77 ++ sed 's/[0-9]//g' + n1= + '[' -n '' ']' + '[' 77 -lt 60 ']' + '[' 77 -ge 60 ']' + '[' 77 -lt 80 ']' + tag=2 + case $tag in + echo $'\345\217\212\346\240\274' 及格 [root@localhost shell]# sh -x case.sh + read -p 'Please input a number: ' n Please input a number: 8sdafasdf ##輸入一個非純數字 + '[' -z 8sdafasdf ']' ++ echo 8sdafasdf ++ sed 's/[0-9]//g' + n1=sdafasdf + '[' -n sdafasdf ']' + echo 'Please input a number.' Please input a number. + exit 1 [root@localhost shell]# sh -x case.sh + read -p 'Please input a number: ' n Please input a number: 123 ##輸入一個大於100的數字 + '[' -z 123 ']' ++ echo 123 ++ sed 's/[0-9]//g' + n1= + '[' -n '' ']' + '[' 123 -lt 60 ']' + '[' 123 -ge 60 ']' + '[' 123 -lt 80 ']' + '[' 123 -ge 80 ']' + '[' 123 -lt 90 ']' + '[' 123 -ge 90 ']' + '[' 123 -le 100 ']' + tag=0 + case $tag in + echo 'The number range is 0-100.' The number range is 0-100.
2018-4-18 17周1次課 shell邏輯判斷、文件目錄屬性判斷、if、case