![不要将命令括在 []/[[]] 中)](https://linux22.com/image/194931/%E4%B8%8D%E8%A6%81%E5%B0%86%E5%91%BD%E4%BB%A4%E6%8B%AC%E5%9C%A8%20%5B%5D%2F%5B%5B%5D%5D%20%E4%B8%AD%EF%BC%89.png)
我刚学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 …
”。