不要将命令括在 []/[[]] 中)

不要将命令括在 []/[[]] 中)

我刚学shell,我使用vscode和shell-check来检查systax。这是我正在做的示例:我想检查某个文本文件中是否存在字符串

#!/usr/bin/bash
Echo "Enter user"
if [ $grep -q binhqq "text.txt"] ; then
  echo "Found"
fi

但他们警告我Don't wrap commands in []/[[]]),为什么我有这个警告,非常感谢你

答案1

您的脚本中存在一些基本问题:

  • 你用Echo而不是echo

  • 您使用$grep而不是grep-$用于取消引用变量,您在这里不需要它

  • 你告诉用户Enter user但没有真正读取任何输入

外壳检查警告:

SC1072: Expected test to end here (don't wrap commands in []/[[]]). Fix any mentioned problems and try again.

之所以引发,是因为grep -q binhqq "text.txt"内部不是有效的 EXPR test(请参阅help test),并且可以通过使用来修复 命令替换:

if [ -n "$(grep binhqq text.txt)" ] ; then

(测试 的输出是否grep非空)或完全删除[and ]

if grep -q binhqq "text.txt" ; then

(依赖于 的退出状态grep)。

答案2

注意语法if(bash 有一个非常有用的交互help系统)

$ help if
if: if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ else COMMANDS; ] fi
    Execute commands based on conditional.

    The `if COMMANDS' list is executed.  If its exit status is zero, then the ...

看到关键字之后,bash 希望看到命令。或或if没有什么特别之处——它们只是内置命令或关键字。我们可以在其中放置任何命令列表/管道。[[[((

神奇之处在于,if分支基于退出状态命令的数量:如果退出状态是然后采用“真实”分支;任何非零退出状态将您置于“false”分支。

答案3

[是命令的别名test(或具有相同功能的内置命令)。

因此,当我们这样做时,[ grep …我们会test grep ….调用命令test并传递它grep …​​。然后test说“我不明白你说的话grep …”。

相关内容