歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> SHELL編程

linux基礎之shell編程(2)-條件判斷,算數運算,測試

bash中如果實現條件判斷?


條件測試類型

整數測試 字符測試 文件測試

條件測試的表達式

有三種

[ expression ]  --方括號與表達式之間一定要有一個空格
[[ expression ]] 
test expression

整數測試


-eq: 測試兩個整數是否相等  例:$A -eq $B
-ne: 測試兩個整數是否不等  不等為真,相等為假
-gt: 測試一個數是否大於另一個數;大於,為真;否則,為假;
-lt: 測試一個數是否小於另一個數;小於,為真;否則,為假;
-ge: 大於或等於
-le: 小於或等於

命令的間邏輯關系


邏輯與: &&
    第一個條件為假時,第二條件不用再判斷;
    第一個條件為真時,第二條件必須得判斷;
邏輯或: ||
    第一個條件為假時,第二條件必須得判斷;
    第一個條件為真時,第二條件不用再判斷;

例:比較兩個數大小

[root@iZ28g26851kZ ~]# A=12
[root@iZ28g26851kZ ~]# B=15
[root@iZ28g26851kZ ~]# [ $A -gt $B ] && echo "A比較大" || echo "B比較大"
B比較大
[root@iZ28g26851kZ ~]# A=20
[root@iZ28g26851kZ ~]# [ $A -gt $B ] && echo "A比較大" || echo "B比較大"
A比較大
[root@iZ28g26851kZ ~]# 

如果A大於B則[ $A -gt $B ] 為真,需要執行(判斷)echo "A比較大"
最終[ $A -gt $B ] && echo "A比較大" 為真,所以不用再執行echo "B比較大"

if語句


——–單分支

if 判斷條件 ;then
    statement1
    ...
fi

——–雙分支

if 判斷條件 ;then
    statement1
    ...
else
    statement2
    ...
fi

——–多分支

if 判斷條件 ;then
    statement1
    ...
elif 判斷條件2 ; then
    statement2
    ...
elif 判斷條件3 ; then
    statement3
    ...
else
    statement4
    ...
fi

例:判斷用戶user1是否存在,存在顯示用戶已存在,不存在則創建用戶,密碼和用戶名相同

adduser.sh

#!/bin/bash
NAME=user1
if id $NAME &> /dev/null; then
   echo "用戶已存在"
else
   echo "當前一共有用戶`wc -l /etc/passwd | cut -d" " -f1`人"
   echo "用戶不存在,正在創建用戶"
   useradd $NAME
   echo $NAME | passwd --stdin $NAME &> /dev/null
   echo "當前一共有用戶`wc -l /etc/passwd | cut -d" " -f1`人"
fi

執行結果

[root@iZ28g26851kZ ~]# ./adduser.sh 
當前一共有用戶30人
用戶不存在,正在創建用戶
當前一共有用戶31人
[root@iZ28g26851kZ ~]# ./adduser.sh 
用戶已存在
[root@iZ28g26851kZ ~]# 

算數運算


之前說了,shell中默認所有變量都是字符串,所以要進行算數運算就必須用命令處理

let

let 算數運算表達式
例:

[root@iZ28g26851kZ ~]# b=23
[root@iZ28g26851kZ ~]# a=12
[root@iZ28g26851kZ ~]# let c=$a+$b
[root@iZ28g26851kZ ~]# echo $c
35
[root@iZ28g26851kZ ~]# 

$[算數運算表達式]

例:

[root@iZ28g26851kZ ~]# c=$[$a+$b*2]
[root@iZ28g26851kZ ~]# echo $c
58
[root@iZ28g26851kZ ~]# 

$((算數運算表達式))

例:

[root@iZ28g26851kZ ~]# c=$(($a*2+$b*2))
[root@iZ28g26851kZ ~]# echo $c
70
[root@iZ28g26851kZ ~]# 

expr


expr 一般用於整數運算,會自動取整,小數點後面的直接去掉
且 運算數與運算符號之間一個要有一個空格,如果沒有空格就會像下面這樣

[root@iZ28g26851kZ ~]# expr 10/3
10/3
[root@iZ28g26851kZ ~]# 

原樣輸出了,,所以必須要加上空格
例:

[root@iZ28g26851kZ ~]# expr 10 / 3
3
[root@iZ28g26851kZ ~]# expr 10 + 3
13
[root@iZ28g26851kZ ~]# expr 10 - 3
7
[root@iZ28g26851kZ ~]# expr 10 * 3
expr: syntax error

可以看出,加,減,除,都沒有問題,唯獨乘法運算時居然說語法錯誤,
好吧,這裡expr應該是吧 * 當匹配字符用了,所以需要轉義一下

[root@iZ28g26851kZ ~]# expr 10 \* 3
30

ok,這樣就搞定了

文件測試


-e FILE: 測試文件是否存在
-f FILE: 測試文件是否為普通文件
-d FILE: 測試指定路徑是否為目錄
-r FILE: 測試當前用戶對指定文件是否有讀取權限
-w FILE: 測試當前用戶對指定文件是否有寫入權限
-x FILE: 測試當前用戶對指定文件是否有執行權限

例:判斷一個文件是否存在,存在則顯示其行數

#!/bin/bash
FILENAME=/etc/passwd
if [ -e $FILENAME ]; then
   echo "文件存在"
   echo "文件一共有` wc -l $FILENAME | cut -d" " -f1`行"
else
   echo "文件不存在"
fi

如何中途退出腳本


在需要退出的地方使用exit #即可,#號為一個退出狀態(0-255的一個數值)。

0:表示腳本執行成功
1-255:表示執行失敗
也可以什麼都不返回,腳本會默認返回上一條結果的執行狀態

例:
exittest.sh

#!/bin/bash
echo "第一行"
echo "第二行"
exit 18
echo "第三行"

執行結果

[root@iZ28g26851kZ ~]# ./exittest.sh 
第一行
第二行
[root@iZ28g26851kZ ~]# echo $?
18
[root@iZ28g26851kZ ~]# 

顯示執行腳本的過程


有些時候,當腳本太長,出錯之後無法快速找到原因,可以使用 bash -x xxx.sh來執行腳本,該命令可將腳本執行的過程顯示出來
例:判斷文件是否存在

filetest.sh

#!/bin/bash
#
FILENAME=/etc/passwd
if [ -e $FILENAME ];then
  echo "文件存在"
else
  echo "文件不存在"
fi

執行

[root@iZ28g26851kZ ~]# bash -x filetest.sh 
+ FILENAME=/etc/passwd
+ '[' -e /etc/passwd ']'
+ echo $'\346\226\207\344\273\266\345\255\230\345\234\250'
文件存在
[root@iZ28g26851kZ ~]# 

這樣就可以很方便的檢查腳本了

Copyright © Linux教程網 All Rights Reserved