我可以执行以下命令来检查"abc"
里面$s
带有星号的字符串字符串通配符
if [[ $s == *"abc"* ]]; then echo 1; fi
但在 中echo
,星号的作用是目录列表。
echo [[ $s == *"abc"* ]]
我怎样才能在 echo 中使用通配符字符串通配符s
? 如果包含,则预期输出应为 1 abc
。
答案1
第一行的语法是if <command>; then ...
,也就是说,[[
被视为一个命令(它是一个特殊的内置命令,有自己独特的通配符规则)。
但是第二行的语法是不是 echo <command>
.你不能给予任何命令就是echo
这样;它只会写出[[
和$s
作为普通文本参数——没有进行比较,也没有应用特殊的通配符规则(由于没有进行字符串比较,所以它们没有用)。
也就是说,它基本上就像echo ls /etc
- 它不会执行ls
任何操作,它只会打印单词“ls /etc”。
如果要在 之外进行字符串比较if
,您仍然需要将[[
作为单独的命令运行,通过 检查或打印其返回代码$?
。例如:
[[ $s == *abc* ]]
echo "Result is $?"
请注意,退出代码用于0
表示成功。如果您想要 1,请使用$(( ... ))
算术扩展:
echo "Result is $(( ($? == 0) ? 1 : 0 ))"
echo "Result is $(( !$? ))"
如果你真的如果您想让它成为一条命令,您可以将其塞进替换中$(...)
:
echo $( [[ $s == *abc* ]]; echo $? )
[[ $s == *abc* ]]; echo $?
...但这实际上和一开始所做的一样。