歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> SHELL編程 >> linux基礎之shell編程(2)

linux基礎之shell編程(2)

日期:2017/3/3 13:01:37   编辑:SHELL編程

bash中如果實現條件判斷?

條件測試類型整數測試

字符測試

文件測試

條件測試的表達式

有三種

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

整數測試

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

命令的間邏輯關系

[code]邏輯與: &&
    第一個條件為假時,第二條件不用再判斷;
    第一個條件為真時,第二條件必須得判斷;
邏輯或: ||
    第一個條件為假時,第二條件必須得判斷;
    第一個條件為真時,第二條件不用再判斷;
例:比較兩個數大小

[code][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語句

——–單分支

[code]if 判斷條件 ;then
    statement1
    ...
fi

——–雙分支

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

——–多分支

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

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

adduser.sh

[code]#!/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

執行結果

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

算數運算

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

let

let 算數運算表達式 例:

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

$[算數運算表達式]

例:

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

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

例:

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

expr

expr 一般用於整數運算,會自動取整,小數點後面的直接去掉

且 運算數與運算符號之間一個要有一個空格,如果沒有空格就會像下面這樣

[code][root@iZ28g26851kZ ~]# expr 10/3
10/3
[root@iZ28g26851kZ ~]#
原樣輸出了,,所以必須要加上空格

例:

[code][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應該是吧 * 當匹配字符用了,所以需要轉義一下

[code][root@iZ28g26851kZ ~]# expr 10 \* 3
30
ok,這樣就搞定了

文件測試

[code]-e FILE: 測試文件是否存在
-f FILE: 測試文件是否為普通文件
-d FILE: 測試指定路徑是否為目錄
-r FILE: 測試當前用戶對指定文件是否有讀取權限
-w FILE: 測試當前用戶對指定文件是否有寫入權限
-x FILE: 測試當前用戶對指定文件是否有執行權限
例:判斷一個文件是否存在,存在則顯示其行數

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

如何中途退出腳本

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

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

exittest.sh

[code]#!/bin/bash
echo "第一行"
echo "第二行"
exit 18
echo "第三行"
執行結果

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

顯示執行腳本的過程

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

例:判斷文件是否存在

filetest.sh

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

[code][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 ~]#
這樣就可以很方便的檢查腳本了

字符測試

相等比較

[code][ string == string ]
記住,[空格string空格==空格string空格]

少一個都不行哦~~

例:

[code][root@iZ28g26851kZ ~]# [ "asd" == "asdd" ]
[root@iZ28g26851kZ ~]# echo $?
1
[root@iZ28g26851kZ ~]# [ "asd" == "asd" ]
[root@iZ28g26851kZ ~]# echo $?
0
[root@iZ28g26851kZ ~]#

不等比較

[code][ string != string ]

例:

[code][root@iZ28g26851kZ ~]# [ "asd" != "asd" ]
[root@iZ28g26851kZ ~]# echo $?
1
[root@iZ28g26851kZ ~]# [ "asd" != "asdd" ]
[root@iZ28g26851kZ ~]# echo $?
0
[root@iZ28g26851kZ ~]#

Copyright © Linux教程網 All Rights Reserved