错误太多参数试图匹配字符串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中的子字符串[重复]的主要内容,如果未能解决你的问题,请参考以下文章