BASH指令碼程式設計之條件測試

2021-10-03 04:16:31 字數 4065 閱讀 5737

條件測試:

判斷某需求是否滿足,需要由測試機制來實現;

如何編寫測試表示式以實現所需的測試:

(1) 執行命令,並利用命令狀態返回值來判斷;

0:成功

1-255:失敗

(2) 測試表示式

test  expression

[ expression ]

[[ expression ]]

注意:expression兩端必須有空白字元,否則為語法錯誤;

bash的測試型別:

數值測試

字串測試

檔案測試

數值測試:數值比較

-eq:是否等於; [ $num1 -eq $num2 ]

-ne:是否不等於;

-gt:是否大於;

-ge:是否大於等於;

-lt:是否小於;

-le:是否小於等於;

字串測試

==:是否等於;

>:是否大於;

<:是否小於;

!=:是否不等於;

=~:左側字串是否能夠被右側的pattern所匹配;

-z "string":判斷指定的字串是否為空;空則為真,不空則假;

-n "string":判斷指定的字串是否不空;不空則真,空則為假;

注意:(1) 字串要加引用;

(2) 要使用[[ ]];

檔案測試

存在性測試

-a  file

例:[ -a /etc/passwd ]

-e  file

檔案的存在性測試,存在則為真,否則則為假;

例:[ -e /etc/passwd ]

存在性及型別測試

-b  file:是否存在並且為 塊裝置 檔案,必須滿足為塊裝置且存在;

例:[ -b /dev/sda ]

-c  file:是否存在並且為 字元裝置 檔案;

-d  file:是否存在並且為 目錄檔案;

-f  file:是否存在並且為 普通檔案;

-h  file或 -l  file:是否存在並且為 符號鏈結檔案;

-p file:是否存在且為 命名管道檔案;

-s  file:是否存在且為 套接字檔案;

檔案許可權測試:

-r  file:是否存在並且 對當前使用者可讀;

-w  file:是否存在並且 對當前使用者可寫;

-x  file:是否存在並且 對當前使用者可執行;

特殊許可權測試:

-u  file:是否存在並且 擁有suid許可權;

-g  file:是否存在並且 擁有sgid許可權;

-k  file:是否存在並且 擁有sticky許可權;

檔案是否有內容:

-s  file:是否有內容;

時間戳:

-n file:檔案自從上一次讀操作後是否被修改過;

從屬關係測試:

-o  file:當前使用者是否為檔案的屬主;

-g  file:當前使用者是否屬於檔案的屬組;

雙目測試:

file1  -ef  file2:file1與file2是否指向同乙個檔案系統的相同inode的硬鏈結;

file1  -nt  file2:file1是否新於file2;

file1  -ot  file2:file1是否舊於file2;

組合測試條件:

邏輯運算:

第一種方式:

command1 && command2    //commd 與 commd

command1 || command2     //commd1 或 commd2

! command          //取反

[ -o file ] && [ -r file ]     //測試乙個檔案是否存在並且是可讀檔案

第二種方式:

expression1  -a  expression2

expression1  -o  expression2

! expression

[ -o file -a -x file ]      

向指令碼傳遞引數

位置引數變數

myscript.sh  argu1 argu2

引用方式:

$1,  $2, ..., $, $, ... //位置引數變數

例:#!/bin/bash

echo $[ $1+$2 ]

輪替:shift  [n]:位置引數輪替 n為數字;

例:#!/bin/bash

echo "first pos $1"

shift 

echo "second pos $1"

特殊變數:過程式程式語言的**執行順序:

順序執行:逐條執行;

選擇執行:

**有乙個分支:條件滿足時才會執行;

兩個或以上的分支:只會執行其中乙個滿足條件的分支;

迴圈執行:

**片斷(迴圈體)要執行0、1或多個來回;

選擇執行:

單分支的if語句:

if  測試條件

then

**分支

fi雙分支的if語句:

if  測試條件; then

條件為真時執行的分支

else

條件為假時執行的分支

fi示例:通過引數傳遞乙個使用者名稱給指令碼,此使用者不存時,則新增之;

#!/bin/bash

#if ! grep "^$1\>" /etc/passwd &> /dev/null; then

useradd $1

echo $1 | passwd --stdin $1 &> /dev/null

echo "add user $1 finished."

fi    

#!/bin/bash

#if [ $# -lt 1 ]; then

echo "at least one username."

exit 2

fiif ! grep "^$1\>" /etc/passwd &> /dev/null; then

useradd $1

echo $1 | passwd --stdin $1 &> /dev/null

echo "add user $1 finished."

fi        

#!/bin/bash

#if [ $# -lt 1 ]; then

echo "at least one username."

exit 2

fiif grep "^$1\>" /etc/passwd &> /dev/null; then

echo "user $1 exists."

else

useradd $1

echo $1 | passwd --stdin $1 &> /dev/null

echo "add user $1 finished."

fi例1:通過命令列引數給定兩個數字,輸出其中較大的數值;

#!/bin/bash

#if [ $# -lt 2 ]; then       //判斷是否小於2個引數

echo "two integers."

exit 2                  

fiif [ $1 -ge $2 ]; then         //判斷是否大於等於

echo "max number: $1."

else

echo "max number: $2."

fi#!/bin/bash

#if [ $# -lt 2 ]; then

echo "two integers."

exit 2

fideclare -i max=$1

if [ $1 -lt $2 ]; then

max=$2

fiecho "max number: $max."

bash指令碼程式設計的條件測試

如何編寫測試表示式來實現所需的測試 1 執行命令,並利用命令狀態返回值來判斷 0 成功 1 255 失敗 2 測試表示式 test expression expression expression expression兩端必須有空格 bash的測試型別 數值測試 eq 是否等於 ne 是否不等於 g...

bash指令碼程式設計之選項

bash指令碼程式設計之選項 getopts getopts 選項字串 名稱 引數 解析選項引數。getopts 被 shell 過程用於解析可定位的引數作為選項。optstring 字串包含待識別的選項字母 如果乙個字母後面跟 著冒號,則該選項期待乙個引數,而該引數應用空格與選項分開。每次啟動時,...

bash指令碼條件測試總結

一 if語句的結構 分為以下三種 單分支 雙分支 多分支 單分支if語句if condition is true then 分支fi雙分支if語句if condition is true then 分支else 分支fi多分支if語句if condition is true then 分支elif ...