shell 脚本中的括号 if 语句
Parentheses in shell script if statements
我目前从事的项目使用了一些 Linux shell 脚本,我发现自己正在编写代码片段看起来像这样:
#!/bin/sh
x=1
if [ $x -eq 1 ]; then
echo "Hello, Dave!"
fi
if command -v pip3 >/dev/null ; then
echo "PIP3 is already present."
fi
上面的方法似乎很管用,但它扰乱了我内心的和谐感。为什么第一个 if 语句只有在有方括号的情况下才能正常运行,而第二个 if 语句只有在没有方括号的情况下才能正常运行?那(很大程度上)是一个反问句;我有一个模糊的理解,这与[ expression ]
实际上是test expression
的缩写有关。但是还是丑.
我似乎遇到了一种改善丑陋的方法,通过在第二个 if 语句中放置 括号,即
if ( command -v pip3 >/dev/null ); then
echo "PIP3 is already present."
fi
显然这是主观的,但我发现上面的代码看起来更容易,尤其是当 if 语句评估的命令很长时。但是,把美学放在一边,我现在担心的是:像上面那样使用括号会产生意想不到的后果吗?我对 ( command )
到底做了什么的理解甚至比我对方括号,但我听说它在 subshell 中运行所述命令。这听起来不会造成问题,但如果我对括号的使用不谨慎,请告知我将不胜感激。
[
确实是 test
的同义词。以下是等价的:
if [ $x -eq 1 ]; then
echo "Hello, Dave!"
fi
if test $x -eq 1; then
echo "Hello, Dave!"
fi
在您的第二个示例中,括号有些多余。他们创建了一个 subshell 命令,其中包含的命令由 subshell 执行,而不是由当前的 shell 执行。通常,添加括号没有实际区别,但情况并非总是如此。考虑以下人工示例。
x=1
if ( x=3; true ); then
echo $x
fi
对比
x=1
if x=3; true; then
echo $x
fi
如果你真的需要一些东西来“包围”条件,请使用大括号:
if { x=3; true; } then
echo $x
fi
但我建议调整您对 shell 代码 应该 的想法。
我目前从事的项目使用了一些 Linux shell 脚本,我发现自己正在编写代码片段看起来像这样:
#!/bin/sh
x=1
if [ $x -eq 1 ]; then
echo "Hello, Dave!"
fi
if command -v pip3 >/dev/null ; then
echo "PIP3 is already present."
fi
上面的方法似乎很管用,但它扰乱了我内心的和谐感。为什么第一个 if 语句只有在有方括号的情况下才能正常运行,而第二个 if 语句只有在没有方括号的情况下才能正常运行?那(很大程度上)是一个反问句;我有一个模糊的理解,这与[ expression ]
实际上是test expression
的缩写有关。但是还是丑.
我似乎遇到了一种改善丑陋的方法,通过在第二个 if 语句中放置 括号,即
if ( command -v pip3 >/dev/null ); then
echo "PIP3 is already present."
fi
显然这是主观的,但我发现上面的代码看起来更容易,尤其是当 if 语句评估的命令很长时。但是,把美学放在一边,我现在担心的是:像上面那样使用括号会产生意想不到的后果吗?我对 ( command )
到底做了什么的理解甚至比我对方括号,但我听说它在 subshell 中运行所述命令。这听起来不会造成问题,但如果我对括号的使用不谨慎,请告知我将不胜感激。
[
确实是 test
的同义词。以下是等价的:
if [ $x -eq 1 ]; then
echo "Hello, Dave!"
fi
if test $x -eq 1; then
echo "Hello, Dave!"
fi
在您的第二个示例中,括号有些多余。他们创建了一个 subshell 命令,其中包含的命令由 subshell 执行,而不是由当前的 shell 执行。通常,添加括号没有实际区别,但情况并非总是如此。考虑以下人工示例。
x=1
if ( x=3; true ); then
echo $x
fi
对比
x=1
if x=3; true; then
echo $x
fi
如果你真的需要一些东西来“包围”条件,请使用大括号:
if { x=3; true; } then
echo $x
fi
但我建议调整您对 shell 代码 应该 的想法。