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

shell中的各種括號用法

本文總結shell中各種括號的用法。參考《Linux命令列與shell指令碼程式設計大全》

一、圓括號()

1、建立程序列表

      例如:$ (pwd ; ls ; cd /etc ; pwd ; cd ; pwd ; ls)

//最後輸出的值表示子shell的數目
ls;ps;echo $BASH_SUBSHELL

test.sh
  PID TTY          TIME CMD
11949 pts/2    00:00:00 bash
15482 pts/2    00:00:00 ps
0


(ls;ps;echo $BASH_SUBSHELL)
test.sh
  PID TTY          TIME CMD
11949 pts/2    00:00:00 bash
15488 pts/2    00:00:00 bash
15490 pts/2    00:00:00 ps
1

//建立了兩次子shell
(ls;ps;(echo $BASH_SUBSHELL))

test.sh
  PID TTY          TIME CMD
11949 pts/2    00:00:00 bash
15503 pts/2    00:00:00 bash
15505 pts/2    00:00:00 ps
2

//顯示 $BASH_SUBSHELL是在第一次建立的子shell執行的,所以結果是1
((ls;ps);echo $BASH_SUBSHELL)
test.sh
  PID TTY          TIME CMD
11949 pts/2    00:00:00 bash
15511 pts/2    00:00:00 bash
15512 pts/2    00:00:00 bash
15514 pts/2    00:00:00 ps
1

2、$(command)執行命令,返回命令的執行結果

3、((expression))expression可以是任意的數學賦值或比較表示式

       例如:((10+20))

       數學計算還可以用:bc命令,方括號var1=$[1 + 5],expr。

4、定義陣列

     mytest=(one two three four five)

5、迴圈語句

for ((i=0;i<5;i++));do echo $i;done

6、擴充套件正則表示式

表示式分組

正則表示式模式也可以用圓括號進行分組。當你將正則表示式模式分組時,該組會被視為一
個標準字元。可以像對普通字元一樣給該組使用特殊字元。舉個例子:
$ echo "Sat" | gawk '/Sat(urday)?/{print $0}'
Sat
$ echo "Saturday" | gawk '/Sat(urday)?/{print $0}'
Saturday
$
結尾的urday分組以及問號,使得模式能夠匹配完整的Saturday或縮寫Sat。
將分組和管道符號一起使用來建立可能的模式匹配組是很常見的做法。
$ echo "cat" | gawk '/(c|b)a(b|t)/{print $0}'
cat

二、方括號[  ]

1、[[expression]]比較字串

if [[ $USER == r* ]]
then
echo "Hello $USER"
else
echo "Sorry, I do not know you"

2、引用陣列元素

     mytest=(one two three four five)

     mytest[2]

3、數學計算:var1=$[1 + 5]

4、實現test命令的功能

if [ condition ]
then
commands
fi

5、正則表示式

BRE特殊字元組,[]之間可以不加空格。

[[:alpha:]] 匹配任意字母字元,不管是大寫還是小寫
[[:alnum:]] 匹配任意字母數字字元0~9、 A~Z或a~z
[[:blank:]] 匹配空格或製表符
[[:digit:]] 匹配0~9之間的數字
[[:lower:]] 匹配小寫字母字元a~z
[[:print:]] 匹配任意可列印字元
[[:punct:]] 匹配標點符號
[[:space:]] 匹配任意空白字元:空格、製表符、 NL、 FF、 VT和CR
[[:upper:]] 匹配任意大寫字母字元A~Z

三、花括號{ }

1、命令分組:語法為{ command; }。使用花括號進行命令分組並不會像程序列表那樣創建出子shell。

2、協程

$ coproc My_Job { sleep 10; }//也就是給協程起別名時用到,{}和命名間有空格
[1] 2570
$
$ jobs
[1]+ Running coproc My_Job { sleep 10; } &
$

3、${variable}形式引用變數。

  1 #!/bin/bash
  2 A=1
  3 B=2
  4 AB=3
  5 echo $AB
  6 echo ${A}B     


  輸出:
  3
  1B

4、讀取引數,shell引數從$0到$9,超過了,就要用花括號

      total=$[ ${10} * ${11} ]

      ${!#}表示最後一個引數(引數個數不算指令碼本身)
5、函式定義

function addem {
echo $[ $1 + $2 ]
}

6、gawk中使用

必須將gawk的指令碼命令放到兩個花括號( {})中。
7、sed命令

$ sed '2{
> s/fox/elephant/
> s/dog/cat/
> }' data1.txt

8、擴充套件正則表示式

POSIX ERE模式

ERE中的花括號允許你為可重複的正則表示式指定一個上限。

$ echo "bet" | gawk --re-interval '/be{1}t/{print $0}'
bet
$ echo "beet" | gawk --re-interval '/be{1}t/{print $0}'
$
通過指定間隔為1,限定了該字元在匹配模式的字串中出現的次數。如果該字元出現多次,
模式匹配就不成立。
很多時候,同時指定下限和上限也很方便。
$ echo "bt" | gawk --re-interval '/be{1,2}t/{print $0}'
$
$ echo "bet" | gawk --re-interval '/be{1,2}t/{print $0}'
bet