bash - 这些 bash 语句都是等价的吗?

标签 bash

我刚刚发现了这个很棒的网站。当我想到以下问题时,我正在阅读 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/

相关文章:

python - 需要帮助来解析文件

linux - 在 Ubuntu 下复制和重命名文件(.bin 到 .pdf)的脚本

bash - 是否有相当于 setenv 的 bash

linux - 如何在我的 Makefile 中将这段代码写成一行

linux - 如何在 bash 脚本中传递两个参数或参数

python - Bash + Python 中的 EoF/Ctrl+D 命令

bash - 使用 ffmpeg 将 youtube-dl 的输出管道传输到脚本使用 echo 看起来不错,但在执行时返回错误

linux - 在 bash 中转义空格

ruby - 读取 ruby​​ 中的所有 shell 变量

linux - 庆典 shell : grepping two strings in same line and use it in if-condition