我正在尝试用/
字符分隔路径名。我试图用这一行来实现这个目标:
IFS='/' read -a FILEPATH_ARRAY <<< "$1"
这是名为retrieveParentDirectories
的方法的一部分,然后在删除最后一个元素(需要进入目录的文件名)之后,将FILEPATH_ARRAY的每个元素放入由/
分隔的字符串中。我这样称呼:
TARGET_PARENT_DIRS=$(retriveParentDirectories "$path_to_target")
其中$path_to_target
是我需要复制的文件的新位置的结束路径。
它不起作用的路径名,并且我最终在尝试复制时遇到问题(因为它没有正确使用),是名称中包含空格的任何目录。例如,如果目录为path/to/some/important file which/im/interested/in
,则会输出path/to/some/important/file/which/im/interested/in
作为最终目录名称。
我需要弄清楚如何让IFS仅在/
上分开,并忽略空格。有没有办法实现这个目标?
答案 0 :(得分:1)
拆分数组的命令是正确的:
set -- "path/to/some/important file which/im/interested/in"
IFS='/' read -a FILEPATH_ARRAY <<< "$1"
当使用数组时,您需要正确引用扩展。考虑
之间的区别# Incorrectly produces 9 directory "names"
printf "%s\n" ${FILEPATH_ARRAY[@]}
和
# Correctly produces 7 directory names
printf "%s\n" "${FILEPATH_ARRAY[@]}"
很少需要在单个命令之外更改IFS
的值。当你这样做时,最好在shell为你恢复更改的环境中进行,而不是自己保存旧值。 (请注意,IFS=$OLDIFS
如果之前未设置,则无法正常恢复IFS
。)
一些例子:
# A subshell
(IFS=/; read -a myarray <<< "$text"; printf "%s\n" "${myarray[@]}")
# A function using the `local` command
my_function () {
# myarray is global and remains set after my_function returns
# IFS is only changed for the duration of the function
local IFS="/"
read -a something <<< "$1"
}
答案 1 :(得分:-1)
回答以后找到此页面的人:
通过在读取命令之前设置IFS变量,它只是本地更改。变量正在分解,但是当我循环遍历数组时,由于IFS恢复到其原始分隔符,因此白色空间被分解。
所需的更改如下,我的阅读声明变为以下三行:
IFS=OIFS
然后,在我完成构建我的路径后,我调用了以下命令:
{{1}}
将它设置回来,这样就没有别的东西搞砸了。
希望我对这个问题感到沮丧,可以在将来帮助其他人!