尽管我已经阅读了大部分有关处理路径名中的空格的问题,但我还没有找到我的情况,即一些一个变量中的路径名。
find
当给出两个基本路径时将需要它,例如:
pa="/home/user/folder1 /home/user/folder2"
find $pa -name '*xy*' ...
这将在以下位置查找匹配项两个都 folder1
和folder2
。
(请注意,这是一个简化的例子;我非常清楚,在这种特殊情况下,您可以将修饰符与跨越两个文件夹的-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。