shell編程之 ()[] {}
shell腳本中各種括號的區別以及用法
2018年08月19日 14:55:33 M_QiJunChao 閱讀數:273最近學到了shell腳本編程,覺得腳本中的不同括號有不同的用處,以及有些括號的格式也有特殊要求,下面我就總結一下各種括號的用法。
一、小括號();雙小括號(())
1、單小括號 ()
1:命令替換。等同於`comm`,shell掃描一遍命令行,發現了$(comm)結構,便將$(comm)中的comm執行一次,得到其標準輸出,再將此輸出放到原來命令。
- # ls
- a b c
- # echo $(ls)
- a b c
- #echo `ls`
- a b c
2:用於初始化數組。如:array=(a b c d)
- [root@localhost ~]# array=(a b c d)
- [root@localhost ~]# declare -a
- declare -a array=‘([0]="a" [1]="b" [2]="c" [3]="d")‘
2、雙小括號 (())
((表達式))常用於算術運算比較,雙括號中的變量可以不使用$符號前綴。括號內支持多個表達式用逗號分開。 只要括號中的表達式符合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以內的偶數
- num=2
- while ((num<100)) #數值與運算符可以沒有空格,變量的使用時也可以不使用$num
- do
- echo "$num"
- ((num=num*2))
- done
二、中括號[ ];雙中括號[[ ]]
1:單中括號[ ]
1:算術比較, 比如一個變量是否為0, [ $var -eq 0 ]
。
-
[ $var1 -ne 0 -a $var2 -gt 2 ] # 使用邏輯與 -a
- [ $var1 -ne 0 -o $var2 -gt 2 ] # 使用邏輯或 -o
對變量或值進行算術條件判斷:
- [ $var -eq 0 ] # 當 $var 等於 0 時,返回真
- [ $var -ne 0 ] # 當 $var 不等於 0 時,返回真
需要註意的是 [ 與 ] 與操作數之間一定要有一個空格,否則會報錯。比如下面這樣就會報錯:
[$var -eq 0 ] 或 [ $var -ne 0]
其他比較操作符:
操作符 | 意義 |
---|---|
-gt | 大於 |
-lt | 小於 |
-ge | 大於或等於 |
-le | 小於或等於 |
可以通過 -a
(and) 或 -o
(or) 結合多個條件進行測試:
- [ $var1 -ne 0 -a $var2 -gt 2 ] # 使用邏輯與 -a
- [ $var1 -ne 0 -o $var2 -gt 2 ] # 使用邏輯或 -o
2:文件屬性測試,比如一個文件是否存在,[ -e $var ]
, 是否是目錄,[ -d $var ]
。
文件系統屬性測試
使用不同的條件標誌測試不同的文件系統屬性。
操作符 | 意義 |
---|---|
[ -f $file_var ] |
變量 $file_var 是一個正常的文件路徑或文件名 (file),則返回真 |
[ -x $var ] |
變量 $var 包含的文件可執行 (execute),則返回真 |
[ -d $var ] |
變量 $var 包含的文件是目錄 (directory),則返回真 |
[ -e $var ] |
變量 $var 包含的文件存在 (exist),則返回真 |
[ -c $var ] |
變量 $var 包含的文件是一個字符設備文件的路徑 (character),則返回真 |
[ -b $var ] |
變量 $var 包含的文件是一個塊設備文件的路徑 (block),則返回真 |
[ -w $var ] |
變量 $var 包含的文件可寫(write),則返回真 |
[ -r $var ] |
變量 $var 包含的文件可讀 (read),則返回真 |
[ -L $var ] |
變量 $var 包含是一個符號鏈接 (link),則返回真 |
使用方法如下:
- fpath="/etc/passwd"
- if [ -e $fpath ]; then
- echo File exits;
- else
- echo Does not exit;
- fi
3:字符範圍。用作正則表達式的一部分,描述一個匹配的字符範圍。作為test用途的中括號內不能使用正則。
- [root@localhost ~]# echo 1234abcdef |tr -cd "[0-9]"
- 1234[root@localhost ~]# cat 1.txt|grep "[0-9]"
- 123
- 135
- 1244
- 156
- 222
- 178
- 189999
- 12gg
- [root@localhost ~]#
4:在一個array 結構的上下文中,中括號用來引用數組中每個元素的編號
- [root@localhost ~]# echo ${name[2]}
- durank
- [root@localhost ~]#
2:雙中括號 [[ ]]
[[ ]] 多用來進行字符串比較, 比如兩個字符串是否相同, [[ $var1 == $var2 ]]
註意 =
前後有一個空格,如果忘記加空格, 就變成了賦值語句,而非比較關系了。
字符串的其他比較情況:
操作符 | 意義 |
---|---|
[[ $str1 != $str2 ]] |
如果 str1 與 str2 不相同,則返回真 |
[[ -z $str1 ]] |
如果 str1 是空字符串,則返回真 |
[[ -n $str1 ]] |
如果 str1 是非空字符串,則返回真 |
使用邏輯運算符 && 和 || 可以輕松地將多個條件組合起來, 比如:
- str1="Not empty"
- str2=""
- if [[ -n $str1 ]] && [[ -z $str2 ]];
- then
- echo str1 is nonempty and str2 is empty string.
- fi
test 命令也可以從來執行條件檢測,用 test 可以避免使用過多的括號,[] 中的測試條件同樣可以通過 test 來完成。
if [ $var -eq 0 ]; then echo "True"; fi
等價於
if test $var -eq 0; then echo "True"; fi
三:大括號{ }
常規用法
1:大括號拓展。在大括號中,不允許有空白,除非這個空白被引用或轉義。
第一種:對大括號中的以逗號分割的文件列表進行拓展。
第二種:對大括號中以點點(..)分割的順序文件列表起拓展作用,
- # 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
2:字符串提取和替換
|
第一種模式:${var:num}
,這種模式時,shell在var中提取第num個字符到末尾的所有字符。若num為正數,從左邊0處開始;若num為負數,從右邊開始提取字串,但必須使用在冒號後面加空格或一個數字或整個num加上括號,如${var: -2}、${var:1-3}或${var:(-2)}。
第二種模式:${var:num1:num2},
num1是位置,num2是長度。表示從$var字符串的第$num1個位置開始提取長度為$num2的子串。不能為負數。
第三種模式:${var/pattern/pattern}
表示將var字符串的第一個匹配的pattern替換為另一個pattern。
第四種模式:${var//pattern/pattern}
表示將var字符串中的所有能匹配的pattern替換為另一個pattern。
- [root@centos ~]# var=/home/centos
- [root@centos ~]# echo $var
- /home/centos
- [root@centos ~]# echo ${var:5}
- /centos
- [root@centos ~]# echo ${var: -6}
- centos
- [root@centos ~]# echo ${var:(-6)}
- centos
- [root@centos ~]# echo ${var:1:4}
- home
- [root@centos ~]# echo ${var/o/h}
- /hhme/centos
- [root@centos ~]# echo ${var//o/h}
- /hhme/cenths
字符大小寫轉換
${var^^}:把var中的所有小寫字母轉換為大寫
${var,,}:把var中的所有大寫字母轉換為
shell編程之 ()[] {}