您的位置:首页 > 运维架构 > Shell

Shell脚本中的各种括号

2016-03-07 00:00 701 查看
摘要: Shell脚本中的各种括号

小括号的用法

1、数组赋值



2、子Shell赋值



在子shell中变量var值为lookback,但是在上级shell中就不是这个值,可以看出是在子shell中有效的赋值

3、命令集合结果重定向



4、$()的用法



$(cmd)命令替换

5、(())的用法



增强括号的用法, 常用于算术运算比较. 双括号中的变量可以不使用$符号前缀, 只要括号中的表达式符合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、单中括号

①bash 的内部命令,[和test是等同的。如果我们不用绝对路径指明,通常我们用的都是bash自带的命令。if/test结构中的左中括号是调用test的命令标识,右中括号是关闭条件判断的。这个命令把它的参数作为比较表达式或者作为文件测试,并且根据比较的结果来返回一个退出状态码。if/test结构中并不是必须右中括号,但是新版的Bash中要求必须这样。
②Test和[]中可用的比较运算符只有==和!=,两者都是用于字符串比较的,不可用于整数比较,整数比较只能使用-eq,-gt这种形式。无论是字符串比较还是整数比较都不支持大于号小于号(双小括号支持)。如果实在想用,对于字符串比较可以使用转义形式,如果比较"ab"和"bc":[ ab \< bc ],结果为真,也就是返回状态为0。[ ]中的逻辑与和逻辑或使用-a 和-o 表示。
③字符范围。用作正则表达式的一部分,描述一个匹配的字符范围。作为test用途的中括号内不能使用正则。
④在一个array 结构的上下文中,中括号用来引用数组中每个元素的编号。

#!/bin/sh

#shell中对变量的值添加单引号,爽引号和不添加的区别,对类型来说是无关的,主要是单引号不
#对相关量进行替换,如$解释成变量引用用值替代,双引号则进行替代

A="$1"
B="$2"

echo "输入的原始值:A=$A,B=$B"

#下面的比较只能用于整数格式的比较(不能是小数),否则出现
#integer expression expected的错误

echo "shell风格:"
if [ $A -eq $B ];then
echo "eq"
fi

if [ $A -ge $B ];then
echo "ge"
fi

if [ $A -le $B ];then
echo "le"
fi

if [ $A -ne $B ];then
echo "ne"
fi

if [ $A -gt $B ];then
echo "gt"
fi

if [ $A -lt $B ];then
echo "lt"
fi

echo "c风格的比较"
#下面的c风格也ok,但主要是需要双括号
if (($A == $B));then
echo "=="
fi

if (($A >= $B));then
echo ">="
fi

if (($A <= $B));then
echo "<="
fi

if (($A != $B));then
echo "!="
fi

if (($A > $B));then
echo ">"
fi

if (($A < $B));then
echo "<"
fi

2、双中括号

①[[是 bash 程序语言的关键字。并不是一个命令,[[ ]] 结构比[ ]结构更加通用。在[[和]]之间所有的字符都不会发生文件名扩展或者单词分割,但是会发生参数扩展和命令替换。
②支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。
③使用[[ ... ]]条件判断结构,而不是[ ... ],能够防止脚本中的许多逻辑错误。比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错。
④bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。

大括号

1、${var}



Shell中变量的原形,当变量名和后面的内容都是变量命名所允许的内容时候这时候直接用$var是不行的得用{}把变量名括起来

2、${var:-string}



当变量var值为空时${var:-a}会把a作为值,当变量var值不为空时,${var:-a}会把var的值作为变量

3、${var:+string}



${var:+a}的替换规则和上面的相反,即当变量var的值不为空的时将值换成a,当变量var为空时则不替换或者说是替换成变量var的值,即空值。(因为变量var此时为空,所以这两种说法我认为是一样的)

4、${var:=string}



当变量var值为空时,${var:=a}会将其赋值为a,且变量var也被赋值是a了,若变量var不为空时,${var:=string}的值都是变量var的值。(很常用的一种用法是,判断某个变量是否赋值,没有的话则给它赋上一个默认值。)

5、${var:?string}



若变量var不为空,则用变量var的值来替换${var:?string};若变量var为空,则把string输出到标准错误中,并从脚本中退出。我们可利用此特性来检查是否设置了变量的值。

6、${var%pattern}



{variable%pattern},这种模式时,shell在variable中查找,看它是否一给的模式pattern结尾,如果是,就从命令行把variable中的内容去掉右边最短的匹配模式

7、${variable%%pattern}



${variable%%pattern},这种模式时,shell在variable中查找,看它是否一给的模式pattern结尾,如果是,就从命令行把variable中的内容去掉右边最长的匹配模式

8、${variable#pattern}



${variable#pattern} 这种模式时,shell在variable中查找,看它是否一给的模式pattern开始,如果是,就从命令行把variable中的内容去掉左边最短的匹配模式

9、${variable##pattern}



${variable##pattern} 这种模式时,shell在variable中查找,看它是否一给的模式pattern开始,如果是,就从命令行把variable中的内容去掉左边最长的匹配模式
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息