错误太多参数试图匹配字符串bash中的子字符串[重复]

Posted

技术标签:

【中文标题】错误太多参数试图匹配字符串bash中的子字符串[重复]【英文标题】:Error too many arguments trying to match substring in string bash [duplicate] 【发布时间】:2021-12-14 09:56:06 【问题描述】:

我有以下代码,我试图匹配给定字符串中的单词“test”:

str="some test string"

if [ $str == *"test"* ]; then # [: too many arguments
    echo "string was found"
else
    echo "string was not found"
fi

输出:

找不到字符串

Bash 版本:

GNU bash, version 4.4.23(1)-release (x86_64-pc-msys)

我做错了什么?

【问题讨论】:

if [[ "$str" == *"test"* ]]; then(注意$str 和双引号[[ ]] @0stone0 这是我尝试过的地方,但我仍然得到相同的输出和错误提示 [: too many arguments 您确定您使用的是 bash 吗?请分享版本。以上应该可以工作as you can test in this online demo 使用[时,LHS操作数总是需要引用"$str" @meJustAndrew [ ][[ ]] 具有明显不同的语法,并且只有 [[ ]] 可以像您尝试那样进行模式匹配。您必须为此切换到双括号版本。请参阅 BashFAQ #13: "What is the difference between test, [ and [[ ?" 和 Unix 和 Linux 问题 "What is the difference between the Bash operators [[ vs [ vs ( vs ((?" 【参考方案1】:

这部分[ $str == *"test"* ] 被评估为文件模式全局。如果你在那个目录中有几个以 test 开头的文件,你会得到“太多参数”

基本上,这是在评估 [ $str == somethingttest testish test ],但带有 == 的 [] 只需要三个参数。

另一个问题是使用带有[ ] 的模式。它不支持 afaik。如果您想匹配某个模式,请在您的情况下使用 [[ $foo =~ PATTERN ]][[ $str =~ test ]]

【讨论】:

太棒了!我确实有一个本地文件名为 test.删除它使错误消失,但仍未找到该字符串。在添加两组方括号而不是一组之后,字符串得到匹配。非常感谢! btdt... np。除非您有理由不这样做,否则请坚持使用双括号,它们更安全。 [[ .. ]] 支持带有=== 的shell 模式(*test*),或带有=~ 的正则表达式。换句话说,[[ $str == *test* ]] 也可以。请注意,左侧是为我们引用的,所以我们不必照顾它(虽然它不会受伤),而右侧不得被引用或者该模式不被识别。

以上是关于错误太多参数试图匹配字符串bash中的子字符串[重复]的主要内容,如果未能解决你的问题,请参考以下文章

SOLR 中的子字符串匹配

IO重定向&管道&元字符

根据匹配 where 条件中的子字符串来选择值

重命名两个目录中的文件名如果它们之间的某些字符匹配 - 矢量下标超出范围

匹配字符串中的子字符串,允许 1 个字符不匹配

红移数据库中的子字符串匹配