1. 程式人生 > 其它 >shell中各種括號的用法

shell中各種括號的用法

一、單小括號()
1、將某個命令的返回值作為某個變數的值進行傳遞

#!/bin/bash
USER=$(whoami)
echo $USER

[root@jump ~]# for i in $(seq 0 4);do echo $i;done
0
1
2
3
4

2、用於初始化陣列

array=(1 2 3 4)

二、雙小括號(())
1、整數運算(不支援浮點型)

[root@jump ~]# echo $((1+1))
2

2、進位制轉換

16進位制轉10進位制
[root@jump ~]# echo $((16#5f))
95

3、重新定義變數的值

[root@jump ~]# for ((i=0;i<5;i++));do echo $i;done
0
1
2
3
4

4、算數比較

[root@jump ~]# i=5;if (($i>1));then echo "yes";fi
yes

三、單中括號[...]

算數比較
[root@jump ~]# i=5;if [ $i -ge 1 ];then echo "yes";fi
yes

四、雙中括號[[...]]

支援字串模式匹配,甚至支援正則表示式;使用[[...]]條件判斷,能夠防止指令碼中的許多邏輯錯誤,比如,&&、||、<和> 操作符能夠正常存在於[[ ]]條件判斷結構中,但是如果出現在[ ]結構中的話,會報錯;
[root@jump ~]# if [[ hello==hell? ]];then echo "yes";fi
yes

五、大括號{...}

1、常規用法

for i in {1..4};do echo $i;done   #列印1到4的數字;
touch {1..4}.txt  #建立1.txt 2.txt 3.txt 4.txt檔案
touch {1,4}.txt   #建立1.txt 4.txt檔案

2、變數替換

2.1、${var:-string}和${var:=string}
如果變數var為空,則將string賦值給${var:-string}和${var:=string};

[root@jump ~]# cat aaa.sh
#!/bin/bash
NUM=$1

if [ ${NUM:="1"} -gt 10 ];then
    echo "比10大"
else
    echo "比10小"
fi

echo "輸入值為:"${NUM:-"1"}
[root@jump ~]# bash aaa.sh
比10小
輸入值為:1
[root@jump ~]# bash aaa.sh 55
比10大
輸入值為:55

2.2、${var:+string}
  變數var不為空的時候,才將string賦值給${var:+string};
2.3、${var:?string}
  變數為空的時候,則把string輸出到標準錯誤中,並從指令碼中退出;

[root@jump ~]# cat str.sh
#!/bin/bash
NUM=$1
if [ ${NUM:?"1"} -gt 10 ];then
    echo "比10大"
else
    echo "比10小"
fi
[root@jump ~]# bash str.sh
str.sh:行3: NUM: 1
[root@jump ~]# bash str.sh 3
比10小

2.4、模式匹配

# 是去掉左邊
% 是去掉右邊
#和%中的單一符號是最小匹配,兩個相同符號是最大匹配。
[root@jump ~]# var="hello word"
[root@jump ~]# echo $var
hello word
[root@jump ~]# echo ${var%o*d}
hello w
[root@jump ~]# echo ${var%%o*d}
hell
[root@jump ~]# echo ${var#?e}
llo word
[root@jump ~]# echo ${var##?e}
llo word
[root@jump ~]# echo ${var##*e}
llo word
[root@jump ~]# echo ${var##*s}
hello word
[root@jump ~]# echo ${var##*d}

[root@jump ~]# echo ${var##*r}
d
[root@jump ~]# echo ${var##hello}
word

  以上操作都不會改變variable的值,其中,只有在pattern中使用了*匹配符號時,%和%%,#和##才有區別。結構中的pattern支援萬用字元,*表示零個或多個任意字元,?表示僅與一個任意字元匹配,[...]表示匹配中括號裡面的字元,[!...]表示不匹配中括號裡面的字元。

2.5、字串的提取和替換

[root@jump ~]# var=/data/nginx
[root@jump ~]# echo $var
/data/nginx
[root@jump ~]# echo ${var:5}
/nginx
[root@jump ~]# echo ${var: -5}
nginx
[root@jump ~]# echo ${var: -6}
/nginx
[root@jump ~]# echo ${var:(-6)}
/nginx
[root@jump ~]# echo ${var:1:4}
data
[root@jump ~]# echo ${var/t/a}
/daaa/nginx
[root@jump ~]# echo ${var/a/o}
/dota/nginx
[root@jump ~]# echo ${var//a/o}
/doto/nginx