條件測試:
判斷某需求是否滿足,需要由測試機制來實現;
如何編寫測試表示式以實現所需的測試:
(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 ...