bash的算术表达式结构:解决一切算术表达式的烦恼

在使用 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))这个条件结构有哪些特性

  1. 引用变量的值,不需要前缀的美元符号。
  2. 不再需要任何空格。

你能在高级语言中使用的算术运算,基本都可以使用 (()) 这个条件结构来完成,例如变量自动递增,变量赋值等等。

那么为何(())不需要使用空格进行分隔呢?据我猜测,(())是元字符,而元字符本来就起到了分隔作用。可见 bash 对 shell 的改进,有时真让人脑壳疼。但是我们可以为了美观效果,也加上空格进行分隔。这样就不会有任何烦恼了。

通过一个例子来了解条件结构的用法,如下脚本将会显示执行脚本时传入的参数

#!/bin/bash

count=1
# (())执行算术条件判断
while (( $# > 0 )); do
	echo "Arguments #$count = $1"
	# (())执行变量递增,这些最简洁的写法
	((count++))
	# let 命令等价于(())
	#let count++
	shift
done
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章