Linux-Shell語法(5)-常用命令

hjavn發表於2021-09-06

工具與資源中心

幫助開發者更加高效的工作,提供圍繞開發者全生命週期的工具與資源
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的字串。如果POSITIONLENGTH為負數、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 協議》,轉載必須註明作者和本文連結

相關文章