1. 程式人生 > >shell編程之 ()[] {}

shell編程之 ()[] {}

cin 四種 article localhost variable 閱讀 數組 att 用法

shell腳本中各種括號的區別以及用法

2018年08月19日 14:55:33 M_QiJunChao 閱讀數:273

最近學到了shell腳本編程,覺得腳本中的不同括號有不同的用處,以及有些括號的格式也有特殊要求,下面我就總結一下各種括號的用法。

一、小括號();雙小括號(())

1、單小括號 ()

1:命令替換。等同於`comm`,shell掃描一遍命令行,發現了$(comm)結構,便將$(comm)中的comm執行一次,得到其標準輸出,再將此輸出放到原來命令。

  1. # ls
  2. a b c
  3. # echo $(ls)
  4. a b c
  5. #echo `ls`
  6. a b c

2:用於初始化數組。如:array=(a b c d)

  1. [root@localhost ~]# array=(a b c d)
  2. [root@localhost ~]# declare -a
  3. 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 ]。

  1. #求100以內的偶數
  2. #! /bin/bash
  3. num=2
  4. while ((num<100)) #數值與運算符可以沒有空格,變量的使用時也可以不使用$num
  5. do
  6. echo "$num"
  7. ((num=num*2))
  8. done

二、中括號[ ];雙中括號[[ ]]

1:單中括號[ ]

1:算術比較, 比如一個變量是否為0, [ $var -eq 0 ]

  1. [ $var1 -ne 0 -a $var2 -gt 2 ] # 使用邏輯與 -a
  2. [ $var1 -ne 0 -o $var2 -gt 2 ] # 使用邏輯或 -o

對變量或值進行算術條件判斷:

  1. [ $var -eq 0 ] # 當 $var 等於 0 時,返回真
  2. [ $var -ne 0 ] # 當 $var 不等於 0 時,返回真

需要註意的是 [ 與 ] 與操作數之間一定要有一個空格,否則會報錯。比如下面這樣就會報錯:

[$var -eq 0 ]  或 [ $var -ne 0] 

其他比較操作符:

操作符意義
-gt 大於
-lt 小於
-ge 大於或等於
-le 小於或等於

可以通過 -a (and) 或 -o (or) 結合多個條件進行測試:

  1. [ $var1 -ne 0 -a $var2 -gt 2 ] # 使用邏輯與 -a
  2. [ $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),則返回真

使用方法如下:

  1. fpath="/etc/passwd"
  2. if [ -e $fpath ]; then
  3. echo File exits;
  4. else
  5. echo Does not exit;
  6. fi

3:字符範圍。用作正則表達式的一部分,描述一個匹配的字符範圍。作為test用途的中括號內不能使用正則。

  1. [root@localhost ~]# echo 1234abcdef |tr -cd "[0-9]"
  2. 1234[root@localhost ~]# cat 1.txt|grep "[0-9]"
  3. 123
  4. 135
  5. 1244
  6. 156
  7. 222
  8. 178
  9. 189999
  10. 12gg
  11. [root@localhost ~]#

4:在一個array 結構的上下文中,中括號用來引用數組中每個元素的編號

  1. [root@localhost ~]# echo ${name[2]}
  2. durank
  3. [root@localhost ~]#

2:雙中括號 [[ ]]

[[ ]] 多用來進行字符串比較, 比如兩個字符串是否相同, [[ $var1 == $var2 ]]

註意 = 前後有一個空格,如果忘記加空格, 就變成了賦值語句,而非比較關系了。

字符串的其他比較情況:

操作符意義
[[ $str1 != $str2 ]] 如果 str1 與 str2 不相同,則返回真
[[ -z $str1 ]] 如果 str1 是空字符串,則返回真
[[ -n $str1 ]] 如果 str1 是非空字符串,則返回真

使用邏輯運算符 && 和 || 可以輕松地將多個條件組合起來, 比如:

  1. str1="Not empty"
  2. str2=""
  3. if [[ -n $str1 ]] && [[ -z $str2 ]];
  4. then
  5. echo str1 is nonempty and str2 is empty string.
  6. fi

test 命令也可以從來執行條件檢測,用 test 可以避免使用過多的括號,[] 中的測試條件同樣可以通過 test 來完成。

if [ $var -eq 0 ]; then echo "True"; fi

等價於

if test $var -eq 0; then echo "True"; fi

三:大括號{ }

常規用法

1:大括號拓展。在大括號中,不允許有空白,除非這個空白被引用或轉義。

第一種:對大括號中的以逗號分割的文件列表進行拓展。

第二種:對大括號中以點點(..)分割的順序文件列表起拓展作用,

  1. # ls {ex1,ex2}.sh
  2. ex1.sh ex2.sh
  3. # ls {ex{1..3},ex4}.sh
  4. ex1.sh ex2.sh ex3.sh ex4.sh
  5. # ls {ex[1-3],ex4}.sh
  6. ex1.sh ex2.sh ex3.sh ex4.sh

2:字符串提取和替換

${var:num},${var:num1:num2},${var/pattern/pattern},${var//pattern/pattern}

第一種模式:${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。

  1. [root@centos ~]# var=/home/centos
  2. [root@centos ~]# echo $var
  3. /home/centos
  4. [root@centos ~]# echo ${var:5}
  5. /centos
  6. [root@centos ~]# echo ${var: -6}
  7. centos
  8. [root@centos ~]# echo ${var:(-6)}
  9. centos
  10. [root@centos ~]# echo ${var:1:4}
  11. home
  12. [root@centos ~]# echo ${var/o/h}
  13. /hhme/centos
  14. [root@centos ~]# echo ${var//o/h}
  15. /hhme/cenths

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

引用:https://blog.csdn.net/qq_27281257/article/details/81837040

shell編程之 ()[] {}