&引用;查找“;删除bash中的多个空格

&引用;查找“;删除bash中的多个空格,bash,find,echo,Bash,Find,Echo,我在bash脚本中有一行代码,它使用find搜索文件夹,并存储其路径 该行如下: findfolder=$(eval echo $(eval "find "$HOME" -iname "$find_regex" -type d -print 2>/dev/null | sort -d | head -1" )) 它几乎在任何情况下都能工作,但是,出于某种原因,如果我搜索一个包含两个空格的文件夹,它将返回一个路径,其中所有双空格都被切换为单空格 因此,如果我搜索一个名为“我的音乐”的文件夹

我在bash脚本中有一行代码,它使用
find
搜索文件夹,并存储其路径

该行如下:

findfolder=$(eval echo $(eval "find "$HOME" -iname "$find_regex" -type d -print 2>/dev/null | sort -d | head -1" ))
它几乎在任何情况下都能工作,但是,出于某种原因,如果我搜索一个包含两个空格的文件夹,它将返回一个路径,其中所有双空格都被切换为单空格

因此,如果我搜索一个名为“我的音乐”的文件夹,在“我的”和“音乐”之间有两个空格,它将返回一个空格的“我的音乐”

如果我直接在终端中运行完全相同的命令,我会得到正确的文件夹

为什么会这样?(如果需要更多的代码,请告诉我。虽然我从终端运行了完全相同的命令,但似乎不相关。我们现在不想毫无理由地看到文本墙)

编辑:

它现在正在工作。第一个eval或echo(不确定,但我的测试表明它是eval)导致输出崩溃,消除了“不必要的”间距。工作守则是:

findfolder="$(eval "find "$HOME" -iname "$find_regex" -type d -print 2>/dev/null | sort -d | head -1" )"

我不明白你想用eval语句做什么。但是,您可以尝试引用命令替换。请注意以下两个命令行之间的差异:

# the two spaces between foo and bar are collapsed
echo $( echo "foo  bar" )

# the two spaces between foo bar bar are kept
echo "$( echo "foo  bar" )"

我不明白你想用eval语句做什么。但是,您可以尝试引用命令替换。请注意以下两个命令行之间的差异:

# the two spaces between foo and bar are collapsed
echo $( echo "foo  bar" )

# the two spaces between foo bar bar are kept
echo "$( echo "foo  bar" )"

有趣。但是你需要双美元($())和eval吗?@PéterVarga在使用eval之前,我没有让它工作。他们修复了使用echo将结果分配给变量的问题。@PéterVarga我现在解决了这个问题。不需要第一次评估和回波,这是导致崩溃的原因。奇怪的是,我在某个时候发现它们是必需的第二个
eval
也不需要,并且在某些情况下会导致解析问题(比如$find_regex匹配当前目录中的多个文件,或者它或$HOME包含空格,等等)。顺便说一句,$find_regex不是正则表达式,它是一种模式,这是完全不同的。例如,“xy?”作为正则表达式与0个或多个“x”匹配,后跟可选的“y”。“xy?”作为一个模式匹配一个单独的“x”,后跟任意字符序列,后跟一个“y”,后跟任意单个字符。@GordonDavisson对模式与正则表达式的关系是正确的。重命名应该可以解决这个问题。但是你在查找多个文件的问题上错了。而且$home和$findregex都不包含空格(在我的情况下永远不会)。我不认为你错了,因为它是不必要的:)有趣。但是你需要双美元($())和eval吗?@PéterVarga在使用eval之前,我没有让它工作。他们修复了使用echo将结果分配给变量的问题。@PéterVarga我现在解决了这个问题。不需要第一次评估和回波,这是导致崩溃的原因。奇怪的是,我在某个时候发现它们是必需的第二个
eval
也不需要,并且在某些情况下会导致解析问题(比如$find_regex匹配当前目录中的多个文件,或者它或$HOME包含空格,等等)。顺便说一句,$find_regex不是正则表达式,它是一种模式,这是完全不同的。例如,“xy?”作为正则表达式与0个或多个“x”匹配,后跟可选的“y”。“xy?”作为一个模式匹配一个单独的“x”,后跟任意字符序列,后跟一个“y”,后跟任意单个字符。@GordonDavisson对模式与正则表达式的关系是正确的。重命名应该可以解决这个问题。但是你在查找多个文件的问题上错了。而且$home和$findregex都不包含空格(在我的情况下永远不会)。我认为你没有错,因为它是不必要的:)