Shell 括號總結

lanyu發表於2021-09-09

1. 單小括號()

I. 命令替換,等同於`command`

echo $(ls)
echo `ls`

II. 子shell命令組合(command1; command2; [command3..])

(ls; pwd;)

III. 初始化陣列

array=(a b c d)
declare -a array='([0]="a" [1]="b" [2]="c" [3]="d")'

2. 雙小括號 (( ))

I. 數值運算

只要括號中的運算子、表示式符合C語言運算規則,都可用在$((exp))中

echo $((16#5f))

II. 算數比較

    雙括號中的變數可以不使用$符號字首。括號內支援多個表示式用逗號分開。 只要括號中的表示式符合C語言運算規則,比如可以直接使用for((i=0;i<5;i++)), 如果不使用雙括號, 則為for i in `seq 0 4`或者for i in {0..4}。再如可以直接使用if (($i<5)), 如果不使用雙括號, 則為if [ $i -lt 5 ]

#求100以內的偶數
 
#! /bin/bash
num=2
while ((num<100))    #數值與運算子可以沒有空格,變數的使用時也可以不使用$num
do
        echo "$num"
        ((num=num*2))
done
  • 迴圈中的自加,變數間的運算都可以使用(())

3. 單中括號[ ]

I. 件屬性測試

運算子 說明 舉例
-b file 檢測檔案是否是塊裝置檔案,如果是,則返回 true。 [ -b $file ] 返回 false。
-c file 檢測檔案是否是字元裝置檔案,如果是,則返回 true。 [ -c $file ] 返回 false。
-d file 檢測檔案是否是目錄,如果是,則返回 true。 [ -d $file ] 返回 false。
-f file 檢測檔案是否是普通檔案(既不是目錄,也不是裝置檔案),如果是,則返回 true。 [ -f $file ] 返回 true。
-g file 檢測檔案是否設定了 SGID 位,如果是,則返回 true。 [ -g $file ] 返回 false。
-k file 檢測檔案是否設定了粘著位(Sticky Bit),如果是,則返回 true。 [ -k $file ]返回 false。
-p file 檢測檔案是否是有名管道,如果是,則返回 true。 [ -p $file ] 返回 false。
-u file 檢測檔案是否設定了 SUID 位,如果是,則返回 true。 [ -u $file ] 返回 false。
-r file 檢測檔案是否可讀,如果是,則返回 true。 [ -r $file ] 返回 true。
-w file 檢測檔案是否可寫,如果是,則返回 true。 [ -w $file ] 返回 true。
-x file 檢測檔案是否可執行,如果是,則返回 true。 [ -x $file ] 返回 true。
-s file 檢測檔案是否為空(檔案大小是否大於 0),不為空返回 true。 [ -s $file ] 返回 true。
-e file 檢測檔案(包括目錄)是否存在,如果是,則返回 true。 [ -e $file ] 返回 true。
fpath="/etc/passwd"
if [ -e $fpath ]; then
  echo File exits;
else
  echo Does not exit;
fi

II. 算數比較

Test和[]中可用的比較運算子只有==和!=,兩者都是用於字串比較的,不可用於整數比較,整數比較只能使用-eq,-gt這種形式。無論是字串比較還是整數比較都不支援大於號小於號。如果實在想用,對於字串比較可以使用轉義形式

[ $var1 -ne 0 -a $var2 -gt 2 ]  # 使用邏輯與 -a
[ $var -eq 0 ]  # 當 $var 等於 0 時,返回真
if [ $a -ne 1] && [ $a != 2 ]或者if [ $a -ne 1 -a $a != 2 ]。

III. 字元範圍。用作正規表示式的一部分,描述一個匹配的字元範圍

cat 1.txt |grep [a-zA-Z]

IV. 陣列元素引用

echo ${array[0]}
echo ${array[@]}

4. 雙中括號

I. 字串比較

[[ ]] 結構比[ ]結構更加通用,其中的所有字元都不會發生檔名擴充套件或單詞分割的問題,並且在其中可以使用萬用字元,比如[[ hello == hell? ]],結果為真。[[ ]]中匹配字串或萬用字元,不需要引號

if [[ $a != 1 && $a != 2 ]]    
if [[ hello == hell? ]]
運算子 意義
[[ $str1 != $str2 ]] 如果 str1 與 str2 不相同,則返回真
[[ -z $str1 ]] 如果 str1 是空字串,則返回真
[[ -n $str1 ]] 如果 str1 是非空字串,則返回真

II. 避免邏輯錯誤

使用[[ ... ]]條件判斷結構,而不是[ ... ],能夠防止指令碼中的許多邏輯錯誤,&&、||、<和> 運算子能夠正常存在於[[ ]]條件判斷結構中,但是如果出現在[ ]結構中的話,會報錯

if [[ $a != 1 && $a != 2 ]]

5. 大括號

I. 大括號擴充套件

  • 第一種:對大括號中的以逗號分割的檔案列表進行擴充。
  • 第二種:對大括號中以(..)分割的順序檔案列表起擴充作用
# ls {ex1,ex2}.sh    
ex1.sh  ex2.sh    
# ls {ex{1..3},ex4}.sh    
ex1.sh  ex2.sh  ex3.sh  ex4.sh    
# ls {ex[1-3],ex4}.sh    
ex1.sh  ex2.sh  ex3.sh  ex4.sh    

II. 字串提取和替換
${var:num},${var:num1:num2},${var/pattern/pattern},${var//pattern/pattern}

III. 字元大小寫轉換

${var^^}:把var中的所有小寫字母轉換為大寫
${var,,}:把var中的所有大寫字母轉換為

IV. 命令組合

{ cmd1;cmd2;cmd3;} 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2035/viewspace-2823495/,如需轉載,請註明出處,否則將追究法律責任。

相關文章