1. 程式人生 > >2018-4-18 17周1次課 shell邏輯判斷、文件目錄屬性判斷、if、case

2018-4-18 17周1次課 shell邏輯判斷、文件目錄屬性判斷、if、case

shell

20.5 shell腳本中的邏輯判斷



·格式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