当变量包含多个路径时如何处理路径名中的空格

syn*_*ror 2 bash find filenames whitespace

尽管我已经阅读了有关处理路径名中空格的大部分问题,但我还没有找到我的案例,即关于一个变量中的多个路径名。

find 当给出两个基本路径时将需要这个,例如:

pa="/home/user/folder1 /home/user/folder2"
find $pa -name '*xy*' ... 
Run Code Online (Sandbox Code Playgroud)

这将寻找在比赛中 folder1folder2

(请注意,这是一个简化的示例;我非常清楚,在这种特殊情况下,您可以使用-path带有folder*跨越两个文件夹的参数的修饰符。但是,这个问题涵盖了您无法解决该问题的情况,因此很容易因为更高的复杂性。)


现在想象一下folder2中间有一个空格。下面将工作:

pa="/home/user/folder1 /home/user/fol\ der2"
find $pa -name '*xy*' ... 
Run Code Online (Sandbox Code Playgroud)

问题是\,它通常用于表示 shell 中的空格,但当变量内容被双引号括起来时将不起作用。但是,与每个变量一条路径不同(它可能会起作用),以下内容也不起作用:

pa=/home/user/folder1 /home/user/fol\ der2
find $pa -name '*xy*' ... 
Run Code Online (Sandbox Code Playgroud)

$ ./test.sh: line 3: /home/user/fol der2: Is a directory

以下变体也不会:

pa=/home/user/folder1 /home/user/fol\ der2
find "$pa" -name '*xy*' ... 
Run Code Online (Sandbox Code Playgroud)

那么如果多个路径包含在一个变量中,如何正确处理路径中的空格呢?

相关问题:是否有任何可靠的方法来确定空格是一个路径与其后继者(在同一变量内)之间的分隔符,还是属于其中包含的路径之一的空格?

Joh*_*024 5

使用bash数组:

pa=("/home/user/folder1" "/home/user/fol der2")
find "${pa[@]}" -name '*xy*' ... 
Run Code Online (Sandbox Code Playgroud)

讨论

观察\并没有做人们希望的事情:

$ pa="/home/user/folder1 /home/user/fol\ der2"
$ printf '%s\n' $pa
/home/user/folder1
/home/user/fol\
der2
Run Code Online (Sandbox Code Playgroud)

\在的定义pa变成字符串文字字符,而不是逃避。如果您想要一个单独的字符串列表,请使用数组。