在使用 shell 的 test 命令处理算术条件表达式时,总让我觉得这个命令是个垃圾。例如
#!/bin/bash
var=5
if [ "$var" -gt 0 -a "$var" -lt 10 ]; then
echo "var is $var"
else
echo "var is not in range"
fi
我在关于shell的test命令格式的各种疑惑这篇文章中,解释了为何test 命令的两个括号内侧要加上空格,为何操作符也要用空格进行分隔。
这些限制让我写代码畏首畏脚,那么有没有办法能避免 test 命令针对算术条件表达式的弊端呢?当然有,最常见的是 bash 提供的一个条件结构((arithmetic expression))
。那么上面的脚本可以改写如下
#!/bin/bash
var=5
if ((var>0&&var<10)); then
echo "var is $var"
else
echo "var is not in range"
fi
从这个脚本中可以看到,((arithmetic expression))
这个条件结构有哪些特性
- 引用变量的值,不需要前缀的美元符号。
- 不再需要任何空格。
你能在高级语言中使用的算术运算,基本都可以使用 (())
这个条件结构来完成,例如变量自动递增,变量赋值等等。
那么为何(())
不需要使用空格进行分隔呢?据我猜测,((
和))
是元字符,而元字符本来就起到了分隔作用。可见 bash 对 shell 的改进,有时真让人脑壳疼。但是我们可以为了美观效果,也加上空格进行分隔。这样就不会有任何烦恼了。
通过一个例子来了解条件结构的用法,如下脚本将会显示执行脚本时传入的参数
#!/bin/bash
count=1
# (())执行算术条件判断
while (( $# > 0 )); do
echo "Arguments #$count = $1"
# (())执行变量递增,这些最简洁的写法
((count++))
# let 命令等价于(())
#let count++
shift
done