玩转shell-那些反人类的括号使用规则大汇总!


在这里插入图片描述

前言

shell 脚本说难也难说不难找起 bug 来确实费劲,是什么导致 shell 语法规则很大众化,但是让我们去找程序的错误却这么费劲呢?这是因为 shell 其实是一个不断增增补补的语言,很多规则都是之前不断“补丁”上去的,导致让人感觉很混乱,特别是这个括号匹配,弄的非常的反人类,如果不是经常使用是很难去记忆的。

单小括号 ()

正则表达式中使用

(aa)|(bb)

用于做某个输出命令,配合$使用

# 这个可以拿到 test.log 的文本
$(cat test.log)

用于数组初始化操作

local arr=(1 2 3 4);

双小括号 (())

表示其中进行数字类型的计算(而且只支持整型),双小括号中还支持布尔值判定,并且当被双小括号框中,整体就应该被看成一个变量。其实这里双小括号里头就是支持 C 语言语法规则,可以不加美元符,可以再加单小括号把一些运算先括起来等

# 默认 a 是字符串类型
a=1;
# 把 a 看成数字,改变前面定义的变量时,必须要加双小括号,或者用 let 语句,否则会把其视为字符串类型
((a++));
let "a++";
# 输出,双小括号应该被看成一个变量
echo $((a+1));

做算术运算符比较时,双小括号表示其中可以使用 C 语言风格,其中变量不用加美元符等,常用语数字表达式判断,若其中有字符串会识别为数字 0

其中都被识别为整型数字,对于数字类型支持常规 c 语言风格的比较运算符

# 这里下面哪里加空格都不影响
a=1;
# if 中判断比较时候的双小括号,其中可以使用 C 语言风格
if ((a==1))
then
	echo "right";
else
	echo "error";
fi;
# for 中算数运算,也完全可以使用 C 语言的形式,如下
for ((i=0;i<5;i++))
do
	echo "$i";
done;
# while 中算数运算判断布尔,也同样
while ((a==1))
do
	echo "$a";
done;

单中括号 []

[ 本来表示一个比较的命令,注意空格

比较的话==!=只支持字符串比较,-eq-gt-lt > < 支持数字类型比较,但是但括号中可不能使用 && 这类的符号哦,想使用就得使用更加扩展的 [[]]

# 其实 [ 本来就是 shell 中的一个命令表示 test 测试布尔值,这也是中括号后为什么要空格的原因。shell 中云算符只支持字符串比较,但是 -eq -gt -lt > < 这些可以支持数字比较
a=1;
# 这里写 a -eq 1 也是成立的,而且双等要用空格隔开两边,否则连在一起会被 [ 命令识别成一个字符串,然后结果就总是 right
if [ $a == 1 ]
then
	echo "right";
else
	echo "error";
fi;

# 想要使用且或者或
if [ $a == 1 ] && [ $a == 2 ]
then
	echo "right";
else
	echo "error";
fi;

正则表达式表示中括号中匹配任意一个

# 能匹配其中任一个就表示匹配成功
[123]

数组固定形式,与其他程序一样

a[0]=1;
printf "${a[0]}";

双中括号 [[]]

在 [] 上的扩展,支持了通配符甚至是正则匹配和 && 等符号,但是模式必须在右边

注意这个双中扩后也要有空格!通常这个 [[]][] 更加实用

对于字符串类型支持的运算有== !=,对于数字类型支持-eq -gt -lt -ge -le

a=1;
# 支持 && ||,以往但括号中是不支持的
if [[ $a == 1 && $a != 2 ]]
# 支持通配符的匹配
if [[ $a == * ]]
# 支持正则,必须要加 =~,且注意右边的模式不能用双引号括起来,否则双引号也被识别为其文本
if [[ $a =~ \d ]]

大括号 {}

对数组的引用

a[0]=1;
echo "${a[0]}";

正则表达式表示前一个字符出连续出现几次

{2,}

通配符表示文件切割

# 会创建 test1.sh 和 test2.sh
touch {test1,test2}.sh
# 会创建 test1.sh test2.sh test3.sh test4.sh 这四个文件
touch {test{1..3},test4}.sh
touch {test[1-3],test4}.sh

表达式符号 ``

抱歉,由于我确实不知道这个符号叫什么名字,目前用表达式符号来代替这个符号的名字

用于写一个可输出的表达式,常用于输出布尔值检测条件

if `$a -eq $b`
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

abcnull

您的打赏是我创作的动力之一

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值