echo 内的字符串比较通配符

Bre*_*sze 2 linux bash

我可以执行以下命令来检查"abc"内部是否$s有星号作为字符串通配符的字符串

 if [[ $s == *"abc"* ]]; then echo 1; fi
Run Code Online (Sandbox Code Playgroud)

但在 an 内部echo,星号充当目录列表

echo [[ $s == *"abc"* ]]
Run Code Online (Sandbox Code Playgroud)

如何将 echo 中的通配符用作字符串通配符s如果包含 ,则预期输出应为 1 abc

use*_*686 6

第一行的语法是if <command>; then ...,即[[被视为命令(并且它是一个特殊的内置命令,有自己独特的通配符规则)。

\n

然而,第二行的语法不是 echo <command>。你不能发出任何echo这样的命令;它只会写出[[$s作为普通文本参数 \xe2\x80\x93 不进行比较,并且不应用特殊的通配符规则(并不是说它们会有用,因为没有进行字符串比较)。

\n

也就是说,它基本上就像echo ls /etc\xe2\x80\x93 它不会有ls任何东西,它只会打印单词“ls /etc”。

\n

如果您想在 之外进行字符串比较if,您仍然需要将 运行[[为单独的命令,通过 来检查或打印其返回代码$?。例如:

\n
[[ $s == *abc* ]]\necho "Result is $?"\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,退出代码用于0成功。如果你想要 1,请使用$(( ... ))算术展开式:

\n
echo "Result is $(( ($? == 0) ? 1 : 0 ))"\necho "Result is $(( !$? ))"\n
Run Code Online (Sandbox Code Playgroud)\n

如果你真的希望它在一个命令中,你可以将它塞进一个$(...)替换中:

\n
echo $( [[ $s == *abc* ]]; echo $? )\n
Run Code Online (Sandbox Code Playgroud)\n

...但这实际上与[[ $s == *abc* ]]; echo $?一开始所做的相同。

\n

  • `[[ ! 是一个坏主意吗? ...]]`? (2认同)