将IFS设置为忽略bash

时间:2015-09-08 20:55:59

标签: bash

我正在尝试用/字符分隔路径名。我试图用这一行来实现这个目标:

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仅在/上分开,并忽略空格。有没有办法实现这个目标?

2 个答案:

答案 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}}

将它设置回来,这样就没有别的东西搞砸了。

希望我对这个问题感到沮丧,可以在将来帮助其他人!