Shell中括号()、(())、[]、[[]]、{}的作用和区别
$()和 反引号
在 bash shell 中,$( ) 与反引号)都可用做命令替换用。一般在脚本中反引号用来对一些比较长需要换行的语句括起来让他们变成一个整体,而 ${ } 会比较精确的界定变量名称的范围。
$ A=B
$ echo $AB
原本是打算先将 $A 的结果替换出来,然后再补一个 B 字母于其后,但在命令行上,真正的结果却是只会提换变量名称为 AB 的值出来…
若使用 ${ } 就没问题了:
$ echo ${A}B
BB
关于变量赋值有一个问题值得思考,这里有四个变量怎么循环输出这四个变量里面的值
name1="nihao1"
name2="nihao2"
name3="nihao3"
name4="nihao4"
这里涉及到了一个反向引用的问题,具体代码实现
name1="nihao1"
name2="nihao2"
name3="nihao3"
name4="nihao4"
for i in {1..4}
do
#使用a作为中间变量,再使用间接引用a的值
a=name$i
echo ${!a}
done
这样才会解析name1到name4变量,真正输出变量里的值
其实再生产中上述方法不可取,这里有一个更好的方案,那就是使用数组,这样就可以实现多组变量在循环中的应用了
#!/bin/bash
a=("黄" "张" "李" "雷")
for i in {0..3}
do
echo ${a[$i]}
done
这样就达到了在循环中引用数组的目的
$[ ] 与 $(( ))
$[]和$(())是一样的,都是进行数学运算的。支持+ - * / %(“加、减、乘、除、取模”)。但是注意,bash只能作整数运算,对于浮点数是当作字符串处理的。
但是这里需要注意的是比较大小时,什么时候用$ [ ] 什么时候使用 $(()) 需要搞清楚这些:
-eq 等于,如:if ["$a" -eq "$b" ]
-ne 不等于,如:if ["$a" -ne "$b" ]
-gt 大于,如:if ["$a" -gt "$b" ]
-ge 大于等于,如:if ["$a" -ge "$b" ]
-lt 小于,如:if ["$a" -lt "$b" ]
-le 小于等于,如:if ["$a" -le "$b" ]
< 小于(需要双括号),如:(("$a" < "$b"))
<= 小于等于(需要双括号),如:(("$a" <= "$b"))
> 大于(需要双括号),如:(("$a" > "$b"))‘
当遇到小数比较的时候和负数的时候可以借助bc进行比较
echo "-1 > 1" | bc
输出0 表示不成立,输出1表示成立
有时候在生产中会遇到一个很大的问题,刚刚在shell监控脚本的时候遇到一个问题,脚本需要监控一个速率但是小数点太长了,导致都是用科学技术法来表示了,对编写报警脚本很不利,因此这边想到一个方法可以直接把小数前面的整数截出来 然后和阈值进行比较这样就达到了目的
if (( `echo " Source_Speed > 2" | bc `));then #Source_Speed代表截取出来的值
echo ok
else
echo " 报警 "
fi
生产中如果可以使用两次awk那就是可以这样做的
[ ]
为test命令的另一种形式,但要注意:
1.必须在左括号的右侧和右括号的左侧各加一个空格,否则会报错。
2.test命令使用标准的数学比较符号来表示字符串的比较,而用文本符号来表示数值的比较。
3.大于符号或小于符号必须要转义,否则会被理解成重定向。
(( ))及[[ ]]
分别是[ ]的针对数学比较表达式和字符串表达式的加强版。
其中
[[ ]]中增加模式匹配特效;
(( ))不需要再将表达式里面的大小于符号转义,除了可以使用标准的数学运算符外,还增加了以下符号:

Shell括号详解
1万+

被折叠的 条评论
为什么被折叠?



