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

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

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

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

pa="/home/user/folder1 /home/user/folder2"
find $pa -name '*xy*' ... 

这将在以下位置查找匹配项两个都 folder1folder2

(请注意,这是一个简化的例子;我非常清楚,在这种特殊情况下,您可以将修饰符与跨越两个文件夹的-path参数一起使用。folder*但是,这个问题涵盖了由于复杂性较高而无法轻松解决问题的情况。)


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

pa="/home/user/folder1 /home/user/fol\ der2"
find $pa -name '*xy*' ... 

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

pa=/home/user/folder1 /home/user/fol\ der2
find $pa -name '*xy*' ... 

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

以下变体也不会:

pa=/home/user/folder1 /home/user/fol\ der2
find "$pa" -name '*xy*' ... 

那么如何在路径中正确处理空格如果一些路径包含在一个变量中吗?

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

答案1

使用bash数组:

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

讨论

观察到它\并没有达到人们所希望的效果:

$ pa="/home/user/folder1 /home/user/fol\ der2"
$ printf '%s\n' $pa
/home/user/folder1
/home/user/fol\
der2

定义\中的pa成为字符串中的文字字符,而不是转义字符。如果您想要单独字符串的列表,请使用数组。

答案2

使用数组变量并在数组的每个元素中放入一个路径值。如果这确实不可能,另一种方法是使用除空间作为您的项目分隔符。

p[0]="hello"
p[1]="happy"
p[2]="world"

echo "p[0]=${p[0]}, p[1]=${p[1]}, p[2]=${p[2]}"

for p in "${p[@]}"
do
    echo "p=$p."
done

ETC。

相关内容