我刚刚发现了这个很棒的网站。当我想到以下问题时,我正在阅读 bash 标记的帖子:
这段代码:
var=$RANDOM
var1=$[ $var % 13 ]
echo "var1 = $var1"
var2=$( $var % 13 )
echo "var2 = $var2"
var3=$(( $var % 13 ))
echo "var3 = $var3"
var4=`expr $var % 13` # Note revised from original post by adding the expr
echo "var4 = $var4"
产生这个输出:
var1 = 7
./question: line 7: 23225: command not found
var2 =
var3 = 7
var4 = 7
所以只有var2语句不起作用。我的问题是:是否应该使用其他三个中的哪一个只是个人选择的问题,还是应该考虑其他因素?
(我在看到回复后对这个问题进行了广泛的编辑。希望我做的是正确的。)
最佳答案
$[]
和 $(())
版本本质上是可以互换的,除了不是所有的 shell 都支持 $[]
, 所以不要使用它——使用 $(())
反而。此外,在这两种形式中,表达式中使用的变量将自动扩展,因此您无需使用 $
。在他们里面:
var=$RANDOM
echo $var # prints 7482 (in my example run)
echo $[ $var % 13 ] # prints 7
echo $[ var % 13 ] # prints 7
echo $(( $var % 13 )) # prints 7
echo $(( var % 13 )) # prints 7
expr
实际上是一个执行表达式计算的命令——它具有与内置表达式计算大部分相同的功能,但没有一些细节。例如,您必须使用 $
扩展变量,并且必须转义 shell 将视为特殊字符的任何运算符(例如 <
、 >
、 |
等):
expr $var % 13 # prints 7
echo `expr $var % 13` # prints 7, just by a less direct route
$()
完全不同——它不进行算术评估,而是将其内容作为命令运行。事实上,它几乎与反引号相同(只是它更易于阅读,语法更清晰,所以我总是使用它而不是反引号):
echo $(expr $var % 13) # prints 7, same as with backquotes
为了让事情变得更复杂,让我添加更多选项:
(( var5 = var % 13 )) # This is an arithmetic statement (that happens to contain an assignment)
echo $var5 # prints 7
let "var6 = var % 13" # Another form for pretty much the same thing
echo $var6 # prints 7
declare -i var7 # declare var7 as an integer...
var7="var % 13" # to force values assigned to it to be evaluated
echo $var7 # prints 7
那么你应该使用什么?我会选择 var3=$(( var % 13 ))
以获得最大的兼容性和(恕我直言)简洁的语法。
关于bash - 这些 bash 语句都是等价的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5994517/