Bash Shell:语法有什么区别?

3

在 BASH shell 中,我在教程中看到了两种 if 语句的语法:

如果没有给变量加引号并添加额外的 [ 和 ],这种方式将不起作用:

if [[ "$step" -eq 0 ]]

这个变量不需要加引号,也不需要额外的 [ 和 ] 就可以正常工作:

if [ $step -ge 1 ] && [ $step -le 52 ]

哪种方式是正确的并且最佳实践?它们之间有什么区别?谢谢!

你说的“不能工作”是什么意思?出现了错误吗?还是出现了意料之外的行为? - Vaughn Cato
是的,第一个出现了错误,需要在 $step 周围加上双引号并添加额外的 [ 和 ]。 - Edward
什么是错误?你得到它时 $step 的值是多少? - Vaughn Cato
除非 $step 为空或包含空格,否则两者都应该有效。 - user123444555621
相关问题:https://dev59.com/NXRB5IYBdhLWcg3wSVi1 - user123444555621
不知道什么是“最佳实践”,但既然你正在使用算术表达式,你可以使用这个有效的bash命令:if (( 1 <= step && step < 52 )); ... - glenn jackman
1个回答

3

“在引用变量时,通常建议将其名称括在双引号中” -- http://tldp.org/LDP/abs/html/quotingvar.html

if [ $step -ge 1 ] && [ $step -le 52 ] 可以替换为

if [ "$step" -ge 1 -a "$step" -le 52 ]

if [[ "$step" -eq 0 ]] 可以替换为 if [ "$step" -eq 0 ]

此外,假设您有以下脚本:

#!/bin/bash
if [ $x -eq 0 ]
then
        echo "hello"
fi

运行脚本时出现以下错误:example.sh: line 2: [: -eq: unary operator expected

但是,使用if [ "$x" -eq 0 ]则会出现另一种错误:example.sh: line 2: [: : integer expression expected

因此,最好将变量放在引号内...

if [[ .... ]]语法在条件语句中包含正则表达式时特别有用 -- http://honglus.blogspot.com/2010/03/regular-expression-in-condition.html

编辑:当我们处理字符串时--

#!/bin/bash
if [ $x = "name"  ]
then
        echo "hello"
fi

当您运行脚本时,会出现以下错误 -- example.sh: line 2: [: =: unary operator expected 但是,如果您使用if [ "$x" = "name" ],它将正常运行(即没有错误),并且if语句将被评估为false,因为x的值为null,与name不匹配。请注意保留HTML标记。

因此,尽管在某些情况下它可能有效,例如处理计数器的单个数字,但在处理字符串时可能会引起问题? - Edward
1
@Edward 我已经在答案中添加了这个...如果你有更多的问题,请告诉我。 - Bill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接