shell中的各种括号用法

本文深入解析Shell脚本中圆括号、方括号与花括号的多种用途,包括进程列表创建、数学运算、字符串比较、数组定义及正则表达式处理等关键功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文总结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


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值