工具與資源中心
幫助開發者更加高效的工作,提供圍繞開發者全生命週期的工具與資源
developer.aliyun.com/tool?spm=a1z3...
本文共介紹以下內容:expr,read,echo,printf,test命令與判斷符號[]
expr命令用於求表示式的值,格式為:expr 表示式
表示式使用方法:
- 用空格隔開每一項
- 用反斜槓放在shell特定的字元前面(即轉義)
- 對包含空格和其他特殊字元的字串要用引號括起來
- expr會在
stdout
中輸出結果,如果為邏輯關係表示式,結果為真stdout
為1,否則為0 - expr也有
exit code
,如果為邏輯關係表示式,結果為真則exit code
為0,否則為1
字串表示式
length STRING
:返回STRING
的長度index STRING CHARSET
:返回CHARSET
中任意單個字元在STRING
中最前面的字元位置,下標從1開始。如果STRING
中沒有CHARSET
中任一字元,則返回0。substr STRING POSITION LENGTH
:返回STRING
字串中從POSITION
開始,長度最大為LENGTH
的字串。如果POSITION
或LENGTH
為負數、0或非數值,則返回空字串。
示例:
str="Hello World!"
echo `expr length "$str"` # 注意 `` 不是單引號,表示獲取 ``中command的stdout,輸出12
echo `expr index "$str" aWd` #輸出 7,下標從1開始
echo `expr substr "$str" 2 3` #輸出 ell
整數表示式
expr
支援普通的算術操作,算術表示式優先順序低於字串表示式,高於邏輯關係表示式。
+ -
:加減運算。兩端引數會轉換為整數,如果轉換失敗則會報錯。* / %
:乘除取模運算。兩端引數會轉換為整數,如果轉換失敗則會報錯。( )
:可以表示優先順序,但需要反斜槓轉義
示例:
a=3
b=4
echo `expr $a + $b` # 輸出7
echo `expr $a - $b` # 輸出-1
echo `expr $a \* $b` # 輸出12,*需要轉義
echo `expr $a / $b` # 輸出0,整除
echo `expr $a % $b` # 輸出3
echo `expr \( $a + 1 \) \* \( $b + 1 \)` # 輸出20,值為(a + 1) * (b + 1)
邏輯關係表示式
|
:如果第一個引數非空且非0,則返回第一個引數的值,否則返回第二個引數的值,但要求第二個引數的值也是非空或非0,否則返回0。如果第一個引數是非空或非0時,不會計算第二個引數。&
:如果兩個引數都非空且非0,則返回第一個引數,否則返回0。如果第一個參為0或為空,則不會計算第二個引數。< <= = == != >= >
:比較兩端的引數,如果為true,則返回1,否則返回0。”==”是”=”的同義詞。”expr”首先嚐試將兩端引數轉換為整數,並做算術比較,如果轉換失敗,則按字符集排序規則做字元比較。( )
:可以該表優先順序,但需要用反斜槓轉義
示例:
a=3
b=4
echo `expr $a \> $b` # 輸出0,>需要轉義
echo `expr $a '<' $b` # 輸出1,也可以將特殊字元用引號引起來
echo `expr $a '>=' $b` # 輸出0
echo `expr $a \<\= $b` # 輸出1
c=0
d=5
echo `expr $c \& $d` # 輸出0
echo `expr $a \& $b` # 輸出3
echo `expr $c \| $d` # 輸出5
echo `expr $a \| $b` # 輸出3
read
命令用於從標準輸入(stdin)中讀取當行資料。當讀到檔案結束符(ctrl+d)時,exit code
為1,否則為0。
可選引數:
-p
:後面可以接要輸出的提示資訊-t
:後面接以秒為單位的數字,定義接受輸入的等待時間,超時會自動忽略此命令
示例:
read name # 讀入 name 的值
ubuntu # stdin
echo $name # 輸出 name 的值
read -p "Please input your name:" -t 30 name # 讀入 name 的值,等待時間 30 秒
echo
命令用於輸出字串,格式為echo STRING
顯示普通字串
echo "hello ubuntu"
echo hello ubuntu # 引號可以省略
顯示轉義字元
-e
參數列示進行轉義,部分轉義字元必須加此引數才起作用。例如:\\ \a \b \c \d \e \f \n \r \t \v
,其他轉義字元可能不需要-e
也可以轉義
echo "\"hello ubuntu\"" # 使用雙引號會轉義
echo \"hello ubuntu\" # 也可以不使用雙引號,也會轉義
# 若沒有轉義可以加引數 -e
echo -e "Hi\n" # -e 開啟轉義
echo "ubuntu"
:<<!
第五行和第六行輸出的內容如下:
Hi
ubuntu
!
顯示變數
name=ubuntu
echo "hi,$name" # 輸出 hi,ubuntu
顯示不換行
echo -e "hi \c" # \c 表示不換行
echo "ubuntu"
輸出結果為:hi ubuntu
顯示結果重定向到檔案
echo "hello ubuntu" > output.txt # 將顯示結果以覆蓋方式輸出到output.txt中
原樣輸出字串,不進行轉義或取變數
name=ubuntu
echo '$name\"'
輸出結果為:$name\"
顯示命令的執行結果(stdout)
echo `date`
輸出結果為:2021年 9月 5日 星期日 19時05分20秒 CST
printf
命令用於格式化輸出,類似C/C++
中的printf
函式,預設不在字串末尾新增換行符。
格式:printf format-string [arguments...]
示例:
指令碼內容:
printf "%10d.\n" 123 # 佔10位,右對齊
printf "%-10.2f.\n" 123.123321 # 佔10位,保留2位小數,左對齊
printf "My name is %s\n" "ubuntu" # 格式化輸出字串
printf "%d * %d = %d\n" 2 3 `expr 2 \* 3` # 表示式的值作為引數
輸出結果:
123.
123.12 .
My name is yxc
2 * 3 = 6
&&
表示與,||
表示或和expr命令中的邏輯運算相似,這兩個邏輯運算子也具有短路原則:
expr1 && expr2
:當expr1
為假時,跳過expr2
的運算expr1 || expr2
:當expr1
為真時,跳過expr2
的運算表示式的
exit code
為0時表示真,非零表示假
在命令列中輸入man test
,可以檢視test
命令的用法。
test
命令用exit code
而不是stdout
返回結果。0表示真,非零表示假。
test命令和邏輯運算子合用做一個簡單條件判斷,例如:
test -e test.sh && echo "exist" || echo "not exist"
# 用於判斷檔案 test.sh 是否存在,存在則輸出 exist,否則輸出 not exist
檔案型別判斷
test -e filename # 判斷檔案是否存在
test -f filename # 判斷是否為普通檔案
test -d filename # 判斷是否為目錄
檔案許可權判斷
test -r filename # 判斷檔案是否可讀
test -w filename # 判斷檔案時否可寫
test -x filename # 判斷檔案是否可執行
test -s filename # 判斷檔案是否非空
整數間的比較
test $a -eq $b # a是否等於b
test $a -ne $b # a是否不等於b
test $a -gt $b # a是否大於b
test $a -lt $b # a是否小於b
test $a -ge $b # a是否大於等於b
test $a -le $b # a是否小於等於b
字串比較
test -z STRING # 判斷STRING是否為空,是則返回true
test -n STRING # 判斷STRING是否為非空,是則返回true,( -n 可以省略)
test str1 == str2 # 判斷str1是否等於str2
test str1 != str2 # 判斷str1是否不等於str2
多重條件判定
test -r filename -a -x filename
-a
:兩條件是否同時成立-o
:兩條件是否至少一個成立!
: 取反。 如test !-x file
當file不可執行時,返回true
[]
與test
的用法幾乎一模一樣,常用於if
語句中,另外還有[[]]
,可以認為是一個加強版,支援更多特性,這裡暫時不介紹。
[ 2 -lt 3 ] # 同樣返回值為 0 時代表真。注意 [ 之後有空格,]之前也有空格,否則會報錯
與test
類似,[]
也可以與邏輯運算合用做簡單的條件判斷
[ -e test.sh ] && echo "exist" || echo "not exist"
需要注意的有:
[]
內的每一項都要用空格隔開[]
內的常量、變數最好都用雙引號括起來,否則可能因常量、變數裡有空格導致報錯
本文轉自:developer.aliyun.com/article/78968...
本作品採用《CC 協議》,轉載必須註明作者和本文連結