Shell指令碼中的邏輯判斷、檔案目錄屬性判斷、if特殊用法 、 case判斷
阿新 • • 發佈:2019-01-07
Shell指令碼中的邏輯判斷
在shell腳本當中很多地方都會用到邏輯判斷,判斷某一個數值,判斷某個目錄或檔案,然後針對判斷的結果再做一個操作,若沒有判斷,是無法進行一些操作的.
例如cp一些檔案,或者MV,或是刪除某個檔案,沒有判斷,寫這些命令就沒什麼意義,也就不叫作shell指令碼,可見shell指令碼非常重要.
shell當中常見的邏輯判斷語法
格式1:if條件;then 語句;if
格式2:if條件;then 語句;else 語句;if
格式3:if ....; then ....;elif...; then...; else...; fi
-lt (小於)
-gt (大於)
-le (小於或等於)
-ge(大於或等於)
-eq(等於)
-ne(不等於)
&& 表示並且
|| 表示或者
#在命令列裡也可以實現,不一定要寫shell指令碼才可以實現,只不過使用命令去實現需要使用分號.
[[email protected] ~]# for i in `seq 1 5`; do echo $i; done
1
2
3
4
5
#不使用分號將會是這樣的
[[email protected] ~]# for i in `seq 1 5`
> do
> echo $i
> done
1
2
3
4
5
格式1:if條件;then 語句;if
在命令列操作
[[email protected] ~]# a=6
[[email protected] ~]# if [ $a -gt 3 ]; then echo ok; fi
ok
說明:方括號兩邊需要有空格,-gt 是大於, $a大於3,那麼這肯定OK的.
在腳本里寫,就整理一下格式即可,然後再執行
[[email protected] sbin]# cat 04.sh
#! /bin/bash
a=6
if [ $a -gt 3 ]
then
echo ok
fi
[[email protected] sbin]# sh 04.sh
ok
格式2:if條件;then 語句;else 語句;if
[[email protected] sbin]# vim 05.sh
#! /bin/bash
a=2
if [ $a -gt 3 ]
then
echo ok
else
echo nook
fi
[[email protected] sbin]# sh -x 05.sh
+ a=2
+ '[' 2 -gt 3 ']'
+ echo nook
nook
#如果$a 大於3,輸出OK, 否則(else),輸出nook
格式3:if ....; then ....;elif...; then...; else...; fi
# 滿足一個條件的情況
[[email protected] sbin]# vim 06.sh
#! /bin/bash
a=6
if [ $a -gt 3 ]
then
echo ">3"
elif [ $a -lt 8 ]
echo "<8 && >3"
else
echo nook
fi
#執行過程
[[email protected] sbin]# sh -x 06.sh
+ a=6
+ '[' 6 -gt 3 ']'
+ echo '>3'
>3
說明:如果$a 大於3,輸出>3 ;又如果(elif)$a 小於8,輸出<8 && >3
那滿足了第一個條件,$a 大於3,輸出>3,後面的條件就不再執行了.
elif 是可以使用多次的;
lt 是小於
#所有條件都不滿足的情況
[[email protected] sbin]# vim 06.sh
#! /bin/bash
a=6
if [ $a -gt 7 ]
then
echo ">7"
elif [ $a -lt 5 ]
then
echo "<5 && >7"
else
echo "nook"
fi
執行過程
[[email protected] sbin]# sh -x 06.sh
+ a=6
+ '[' 6 -gt 7 ']'
+ '[' 6 -lt 5 ']'
+ echo nook
nook
說明:如果$a 大於7,輸出>7,不滿足,執行下一個條件,又如果$a 小於5,輸出<5 && >7,都不滿足,輸出nook
檔案目錄屬性判斷
[ -f file ] 判斷是否是普通檔案,且存在
[ -d file ] 判斷是否是目錄,且存在
[ -e file ] 判斷檔案或者目錄是否存在
[ -r file ] 判斷檔案是否可讀
[ -w file ] 判斷檔案是否可寫
[ -x file ] 判斷檔案是否可執行
[ -f file ] 判斷是否是普通檔案,且存在
# 判斷檔案是否存在,若不存就建立
[[email protected] sbin]# vim file1.sh
#! /bin/bash
f="/tmp/linux"
if [ -f $f ]
then
echo $f exist
else
touch $f
fi
#執行過程
[[email protected] sbin]# sh -x file1.sh
+ f=/tmp/linux
+ '[' -f /tmp/linux ']'
+ touch /tmp/linux
說明:if [ -f $f ] 判斷/tmp/linux 是否存在,明顯是不存在的,所有就touch 了這個檔案
# 重新執行一次,判斷檔案是否存在,若存就輸出結果
[[email protected] sbin]# sh -x file1.sh
+ f=/tmp/linux
+ '[' -f /tmp/linux ']'
+ echo /tmp/linux exist
/tmp/linux exist
說明:前面不存在就touch了, 重新再執行一次肯定是存在的這個檔案,那麼判斷輸出是存在
[ -d file ] 判斷是否是目錄,且存在
# 判斷目錄是否存在,若不存在就建立
[[email protected] sbin]# cat file2.sh
#! /bin/bash
d="/tmp/Anna"
if [ -d $d ]
then
echo $d exist
else
mkdir $d
fi
#執行過程
[[email protected] sbin]# sh -x file2.sh
+ d=/tmp/Anna
+ '[' -d /tmp/Anna ']'
+ mkdir /tmp/Anna
說明:if [ -d $d ] 判斷/tmp/linux 是否存在,明顯是不存在的,所有就mkdir 了這個檔案
#重新執行一次,判斷目錄是否存在,若存在就輸出
[[email protected] sbin]# sh -x file2.sh
+ d=/tmp/Anna
+ '[' -d /tmp/Anna ']'
+ echo /tmp/Anna exist
/tmp/Anna exist
說明:前面不存在就mkdir了, 重新再執行一次肯定是存在的這個檔案,那麼判斷輸出是存在
[ -e file ] 判斷檔案或者目錄是否存在
[[email protected] sbin]# cat file2.sh
#! /bin/bash
f="/tmp/Anna"
if [ -e $f ]
then
echo $f exist
else
mkdir $f
fi
#執行過程
[[email protected] sbin]# sh -x file2.sh
+ f=/tmp/Anna
+ '[' -e /tmp/Anna ']'
+ echo /tmp/Anna exist
/tmp/Anna exist
說明:-e 不管是檔案或目錄,是判斷是否存在,不存在的話就touch
[ -r file ] 判斷檔案是否可讀
[[email protected] sbin]# vim file2.sh
#! /bin/bash
f="/tmp/Anna"
if [ -r $f ]
then
echo $f readable
fi
#執行
[[email protected] sbin]# sh file2.sh
/tmp/Anna readable
[ -w file ] 判斷檔案是否可寫
[[email protected] sbin]# vim file2.sh
#! /bin/bash
f="/tmp/Anna"
if [ -r $f ]
then
echo $f readable
fi
#執行
[[email protected] sbin]# sh file2.sh
/tmp/Anna writeable
說明:可寫是針對當前root使用者,若切換到user使用者,那麼就只有可讀的許可權,沒有可讀許可權
[ -x file ] 判斷檔案是否可執行
[[email protected] sbin]# vim file2.sh
#! /bin/bash
f="/tmp/Anna"
if [ -x $f ]
then
echo $f exeable
fi
#執行
[[email protected] sbin]# sh file2.sh
/tmp/Anna exeable
說明:可寫是針對當前root使用者,若切換到user使用者,那麼就只有可讀的許可權,沒有可執行許可權
判斷一個目錄是否存在,如果存在刪除掉
[[email protected] sbin]# vim file2.sh
#! /bin/bash
d="/tmp/Anna"
if [ -d $d ]
then
rmdir $d
fi
#執行
[[email protected] sbin]# sh -x file2.sh
+ d=/tmp/Anna
+ '[' -d /tmp/Anna ']'
+ rmdir /tmp/Anna
#判斷一個目錄是否存在,如果存在就輸出This is ok, 若不存在就建立
[[email protected] sbin]# vim file2.sh
#! /bin/bash
d="/tmp/Anna"
if [ -d $d ]
then
echo "This is ok"
else [ -d $d ]
mkdir $d
fi
#執行
[[email protected] sbin]# sh -x file2.sh
+ d=/tmp/Anna
+ '[' -d /tmp/Anna ']'
+ echo 'This is ok'
This is ok
if特殊用法
if [ -z "$a" ] 表示當變數a 的值為空時會怎麼樣
if [ -n "$a" ] 表示當變數a的值不為空
if grep -q '123' 1.txt; then 表示如果1.txt中含有‘123’的行時會怎樣
if [ ! -e file ]; then ... 表示檔案不存在時會怎樣
if (($a<1)); then .. 等同於 if [ $a -lt 1 ]; then...
[ ] 中不能使用 <,>, ==, !=,>=,<=這樣的符號
if [ -n "$a" ] 表示當變數a的值不為空
if [ -z "$a" ] 表示當變數a 的值為空
if [ -n "$a" ] 表示當變數a的值不為空
[[email protected] sbin]# if [ -n 09.sh ]; then echo ok; else echo "09.sh is null"; fi
ok
說明: 判斷01.sh 是否為空,不為空 ,輸出is ok
# if [ -z "$a" ] 表示當變數a 的值為空
[[email protected] sbin]# if [ -z "$b" ]; then echo no null; fi
no null
說明:
if [ ! -e file ]; then ... 表示檔案不存在時會怎樣
[[email protected] sbin]# vim file3.sh
#! /bin/bash
if [ ! -f /tmp/Annalinux ]
then
echo "No such file or directory"
exit
fi
if [ -f /tmp/Annalinux ]
then
echo "This is file"
exit
fi
[[email protected] sbin]# sh -x file3.sh
+ '[' '!' -f /tmp/Annalinux ']'
+ '[' -f /tmp/Annalinux ']'
+ echo 'This is file'
This is file
+ exit
說明: 先判斷/tmp/Annalinux 檔案是否存在,如果不存在,輸出 No such file or directory。並退出
如果存在,輸出This is file,並退出.
! -F 表示不存在
-f 表示存在
! -f 和 -f 意思相反
在邏輯判斷中,還可以根據判斷結果,作為判斷結果
[[email protected] sbin]# if grep -w 'apache' /etc/passwd; then echo "apache exist"; fi
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin
apache exist
[[email protected] sbin]# if grep -wq 'apache' /etc/passwd; then echo "apache exist"; fi
apache exist
說明: 如果apache這個單詞在/etc/passwd 這個檔案存在,輸出apache exist
grep -w 選項表示匹配一個單詞, -q不顯示任何資訊
[[email protected] sbin]# if ! grep -w 'user1' /etc/passwd; then echo useradd user1; fi
useradd user1
說明: if ! grep -w 'user1' 取反的意思,如果user1這個使用者不存在,那麼建立user1使用者.
cace判斷
case 邏輯判斷
說明:這個指令碼的目的是讓使用者輸入一個數字,然後用這個指令碼去判斷使用者輸入的數字的一個範圍
[[email protected] sbin]# vim case.sh
#! /bin/bash
read -p " Please input a number: "n
if [ -z "$n" ] //判斷 $n是否為空, 為空的話,說明使用者沒有輸入數字
then
echo "Please input a number." //那麼就提示請輸入數字
exit 1 //然後退出來,返回一個數值 1
fi
n1=`echo $n |sed 's/[-0-9]//g'` //判斷輸入的是否是純數字,echo 出來後,做一個特殊操作,使用sed 把所有
的數字 0-9 清空, $n1 這個變數就為空了
if [ ! -z $n1 ] // 當變數不為空時,說明輸入的不是數字,不合法,則提示繼續輸入數字
當變數為空時繼續往下執行,說明輸入的是數字
then
echo "Please input a number." //繼續提示輸入數字
exit 1 //繼續退出來,返回一個數值 1
#elif [ $n -lt 0 ] || [ $n -gt 100 ]
#then
# echo "Then number range is 0-100."
# exit 1
fi
if [ $n -lt 60 ]
then
tag=1
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)
echo "良好"
;;
4)
echo "優秀"
;;
*)
echo "The number range is 0-100."
;;
esac
# read -p " Please input a number: "n
說明 n 作為捕獲一個變數的名字,使用者輸入什麼數字,那麼這個n 就會賦值什麼數字,這就是read -p 的作用
演示:
[[email protected] sbin]# read -p " Please input a number: " n
Please input a number: 100
[[email protected] sbin]# echo $n
100
[[email protected] sbin]# read -p " Please input a number: " n
Please input a number: 800
[[email protected] sbin]# echo $n
800
#執行,輸入數字90
[[email protected] sbin]# sh -x case.sh
+ read -p ' Please input a number: ' n
Please input a number: 90
+ '[' -z 90 ']' //判斷 90 變數是否存在
++ sed 's/[-0-9]//g' // $n1 清空
++ echo 90
+ n1= //$n1 為空
+ '[' '!' -z ']' // 判斷是否不為空,不為空說明正常,往下匹配
+ '[' 90 -lt 60 ']'
+ '[' 90 -ge 60 ']'
+ '[' 90 -lt 80 ']'
+ '[' 90 -ge 80 ']'
+ '[' 90 -lt 90 ']'
+ '[' 90 -ge 90 ']'
+ '[' 90 -le 100 ']'
+ tag=4 //匹配到了第4個條件
+ case $tag in
+ echo $'\344\274\230\347\247\200'
優秀
# 執行,輸入非數字,就會提示請輸入數字
[[email protected] sbin]# sh -x case.sh
+ read -p ' Please input a number: ' n
Please input a number: gsagas
+ '[' -z gsagas ']' //判斷 gsagas 變數是否存在
++ sed 's/[-0-9]//g' //清空$n1 所有數字
++ echo gsagas
+ n1=gsagas //$n1不為空,所以輸入的不是數字有問題
+ '[' '!' -z gsagas ']'
+ echo 'Please input a number.'
Please input a number. //提示請輸入數字
+ exit 1