1、shell腳本中的邏輯判斷
在shell腳本中,不少都會邏輯判斷,判斷某一個數值,判斷某一個文件,或者某一個目錄,咱們針對判斷結果再作一些操做,若是沒有判斷,就無法作一些操做
格式1:if條件;then語句;fi
例子:
[root@linux-01 ~]# if [ $a -ge 3 ] //分行寫就是這樣寫linux
then
echo ok
fi
ok
[root@linux-01 ~]# if [ $a -ge 3 ]; then echo ok; fi //這是一行寫的格式
//解釋:-gt表示大於的意思,格式比較特殊:方括號內的兩邊必須都要有空格,-gt的兩邊必須都要有空格,條件語句處處都是空格
咱們能夠把上面的這條命令寫成腳本:
[root@linux-01 ~]# cd shell/
[root@linux-01 shell]# vi if1.sh
#!/bin/bash
a=5
if [ $a -gt 3 ]
then
echo ok
fi
[root@linux-01 shell]# sh if1.sh //執行腳本,查看腳本執行結果
ok
大部分的腳本都使用這個格式,都使用邏輯判斷if ,thenshell
格式2:if條件;then語句;else語句;fi
例子:
[root@linux-01 shell]# cp if1.sh if2.sh
[root@linux-01 shell]# vi if2.sh
#!/bin/bash
a=1
if [ $a -gt 3 ]
then
echo ok
else
echo nook
fi
[root@linux-01 shell]# sh if2.sh //執行增長了else語句的判斷,輸出nook
nook
[root@linux-01 shell]# sh -x if2.sh //-x能夠查看腳本的詳細執行過程bash
格式3:if...;then...;elif...;then...;else...;fi
例子:
[root@linux-01 shell]# cp if2.sh if3.sh
[root@linux-01 shell]# vi if3.sh
#!/bin/bash
a=5
if [ $a -gt 1 ] //若是a大於1
then
echo ">1" //輸出>1
elif [ $a -lt 6 ] //在大於1的基礎上小於6,elif這個條件判斷能夠寫屢次
then
echo "<6 && >1" //輸出<6 && >1
else //else表示除了上面兩個條件以外的其餘的條件了
echo nook
fi
[root@linux-01 shell]# sh -x if3.sh //使用-x選項查看腳本詳細執行過程ide
1
上面這個if3.sh這個腳本的邏輯可能有問題,須要改進
邏輯判斷表達式:
if [ $a -gt $b ] 表示若是a>b;
if [ $a -lt 5 ]表示若是a<5;
if [ $b -eq 10 ]表示若是b=10;
if [ $b -ne 10 ]表示若是b不=10;
-gt(>)
-lt(<)
-ge(>=)
-le(<=)
-eq(==)
-ne(!=)
若是想直接使用大於號小於號,能夠換種格式去寫
[root@linux-01 shell]# a=3
[root@linux-01 shell]# if (($a>1)); then echo ok; fi //使用兩個括號,可是使用起來繁瑣
ok
可使用&& || 結合多個條件,&&表示而且,||表示或者
if [ $a -gt 5 ] && [ $a -lt 10 ]; then //若是a大於5而且小於10,then
if [ $b -gt 5 ] || [ $b -lt 3 ]; then //若是b大於5或者小於3,then3d
2、文件目錄屬性判斷
一、[ -f file ]判斷文件是不是普通文件,而且存在
實例:建立file1.sh腳本
[root@linux-01 shell]# vi file1.sh
#!/bin/bash
f="/tmp/aminglinux"
if [ -f $f ]
then
echo $f exist
else
touch $f
fi
[root@linux-01 shell]# sh -x file1.sh //查看腳本執行過程code
二、[ -d file ]判斷文件是不是目錄,而且存在
實例:
[root@linux-01 shell]# cp file1.sh file2.sh //拷貝下file1,sh腳本去修改
[root@linux-01 shell]# vi file2.sh
#!/bin/bash
f="/tmp/aminglinux"
if [ -d $f ] //這裏修改成-d,判斷是否是
then
echo $f exist
else
touch $f
fi
[root@linux-01 shell]# sh -x file2.sh blog
三、[ -e file ]判斷文件或目錄是否存在
實例;
[root@linux-01 shell]# vi file2.sh
#!/bin/bash
f="/tmp/aminglinux"
if [ -e $f ] //-e判斷它不論是文件或者目錄
then
echo $f exist
else
touch $f
fi
[root@linux-01 shell]# sh -x file2.sh字符串
四、[ -r file ]判斷文件是否可讀
實例:
[root@linux-01 shell]# vi file2.sh
#!/bin/bash
f="/tmp/aminglinux"
if [ -r $f ]
then
echo $f readable
fi
[root@linux-01 shell]# sh file2.sh //執行腳本,提示可讀
/tmp/aminglinux readableinput
五、[ -w file ]判斷文件是否可寫
實例:
[root@linux-01 shell]# vi file2.sh
#!/bin/bash
f="/tmp/aminglinux"
if [ -w $f ]
then
echo $f writeable
fi
[root@linux-01 shell]# sh file2.sh ////執行腳本,提示可寫
/tmp/aminglinux writeable
那它判斷可讀可寫其實是判斷執行這個shell腳本的當前用戶,咱們是以root的身份去執行的腳本it
六、 [ -x file ]判斷文件是否可執行
實例:
[root@linux-01 shell]# vi file2.sh
#!/bin/bash
f="/tmp/aminglinux"
if [ -x $f ]
then
echo $f exeable
fi
[root@linux-01 shell]# sh file2.sh //由於沒有執行的權限,咱們的腳本也沒有定義else,因此沒有任何輸出信息
下面對這個腳本進行改良
在工做中使用最多的是:一般先判斷文件存在不存在,若是存在,就會刪除這個文件,&&表示當前面的命令執行成功之後纔會去執行後面的命令
那麼[ -f $f ] && rm -f $f這一行命令等同於下面這四行命令
if [ -f $f ]
then
rm -f $f
fi
[ -f $f ] || touch $f 表示若是$f文件執行不成功的時候,才執行後面的touch $f命令
[ -f $f ] || touch $f 等同於下面這四行
if [ ! -f $f ]
then
touch $f
fi
3、if特殊用法
一、if [ -z "$a" ] 這個表示當變量a的值爲空時會怎麼樣
例子:
[root@linux-01 shell]# vi if4.sh
#!/bin/bash
n=wc -l /tmp/lalal
if [ -z "$n" ]
then
echo error
exit
elif [ $n -gt 100 ]
then
echo abcdef
fi
//if [ -z "$n" ]表示當變量n的值爲空的時候
[root@linux-01 shell]# sh -x if4.sh //執行腳本,查看執行過程
++ wc -l /tmp/lalal
wc: /tmp/lalal: No such file or directory
對if4.sh腳本再次完善:
[root@linux-01 shell]# vi if4.sh
#!/bin/bash
if [ ! -f /tmp/lalal ]
then
echo "/tmp/lalal not exist."
exit
fi
n=wc -l /tmp/lalal
if [ -z "$n" ]
then
echo error
exit
elif [ $n -gt 100 ]
then
echo abcdef
fi
[root@linux-01 shell]# sh if4.sh //執行腳本,若是/tmp/lalal文件不存在,就直接退出腳本
/tmp/lalal not exist.
二、if [ -n "$a" ] 表示當變量a的值不爲空
實例:
[root@linux-01 shell]# if [ -n 01.sh ]; then echo ok; fi //若是01.sh不爲空,輸出ok
ok
[root@linux-01 shell]# if [ -n "$b" ]; then echo $b; else echo "b is null"; fi
b is null
//若是變量b值不爲空,輸出$b,不然輸出"b is null"
注意,若是[ -n 01.sh ]的是文件,不須要使用引號,若是 [ -n "$b" ]中的是變量,須要使用引號引發來
三、if grep -q '123' 1.txt; then 表示若是1.txt中含有‘123’的行時怎麼樣
例子:
需求:在腳本中,可使用一個命令的結果做爲判斷條件,判斷某一個文件中是否含有某一個字符串,好比判斷系統中的用戶裏面是否有user1這個用戶,咱們可使用以下命令去判斷
[root@linux-01 shell]# grep -w 'user1' /etc/passwd //-w選項能夠更加精準的去匹配
user1:x:1000:1000::/home/user1:/bin/bash
有了這樣的思路,能夠這樣去判斷
[root@linux-01 shell]# if grep -wq 'user1' /etc/passwd; then echo "user1 exist"; fi //-q選項能夠不顯示過濾掉的內容
user1 exist
四、if [ ! -e file ]; then 表示文件不存在時會怎麼樣
五、if (($a<1)); then... 等同於 if [ $a -lt 1 ]; then...
六、[ ] 中不能使用<,>,==,!=,>=,<=這樣的符號
4、case判斷
雙分號表示第一個判斷結束,進入下一個判斷
Shell腳本實例:
[root@linux-01 shell]# vi case.sh
#!/bin/bash
read -p "Please input a number: " n //請用戶輸入一個數字,n做爲一個捕獲的變量用戶輸入什麼輸出什麼值
if [ -z "$n" ] //若是n的值爲空,請輸入一個數字
then
echo "Please input a number."
exit 1 //退出來捕獲變量1的值
fi
n1=echo $n|sed 's/[0-9]//g'
//判斷輸入的數字是否含有字母或全是字母,使用sed把全部數字置空
if [ ! -z $n1 ] //這一行或者使用if [ -n "$n1" ]代替,若是判斷不爲空,退出來,提示用戶輸入一個數字
then
echo "Please input a number."
exit 1
fi //若是爲空,說明輸入的合法,繼續執行下面的腳本內容
if [ $n -lt 60 ] && [ $n -ge 0 ] //若是是數字,須要判斷數字的範圍thentag=1elif [ $n -ge 60 ] && [ $n -lt 80 ]thentag=2elif [ $n -ge 80 ] && [ $n -lt 90 ]thentag=3elif [ $n -ge 90 ] && [ $n -le 100 ]thentag=4elsetag=0ficase $tag in1)echo "not ok";;2)echo "ok";;3)echo "ook";;4)echo "oook";;*)echo "The number range is 0-100.";;esac