在条件中使用通配符匹配字符串的开头

EAG*_*G08 8 bash wildcards conditional-statements

试图让一个变量遇到一个长度不同的文本字符串。字符串中重要的部分是前几个字符。

var1=hello  
if [ $var1 == hello ]; then  
    echo success  
fi
Run Code Online (Sandbox Code Playgroud)

或者

var1=hello  
if [ $var1 == h*o ]; then  
    echo success  
fi
Run Code Online (Sandbox Code Playgroud)

输出:成功

但由于我关心前 3 个字符左右,这听起来合乎逻辑,但不起作用:

var1=hello  
if [ $var1 == hel* ]; then  
    echo success  
fi
Run Code Online (Sandbox Code Playgroud)

输出:-bash: [: 参数太多

由于我只关心前几个字符,我可以这样做:

var1=hello 
if [ ${var1:0:3} == hel ]; then 
    echo success  
fi
Run Code Online (Sandbox Code Playgroud)

那会起作用,但我正在寻找解释为什么我会收到该错误以及可能的更好的书面解决方案。

Pau*_*aul 11

当您*if类似的情况下使用时,它会进行文件名扩展。所以在第一种情况下,h*o可能与您当前目录中的文件匹配,因此测试通过。

hel*匹配到几个文件,所以成为了太多的参数if命令。

尝试使用 if [[ $var1 == hel* ]]; then

双括号将测试转换为正则表达式,*通配符将按您的预期工作。

  • @AFH:不,通配符需要在引号之外!内引号是按字面意思理解的。所以它要么像保罗写的那样,要么如果你需要字符串中的空格来匹配,那么`if [[ "$var1" == "some string"* ]]; 然后……` (2认同)
  • @AFH:好吧,试试看:`var1=hello; if [[ $var1 == "hel*" ]]; 然后回声OK; else echo 不匹配;fi` 说“不匹配”。用引号外的通配符表示“OK”:`var1=hello; if [[ $var1 == "hel"* ]]; 然后回声OK; else echo 不匹配;菲` (2认同)