将IFS设置为忽略bash中的空白

将IFS设置为忽略bash中的空白,bash,Bash,我试图用/字符分隔路径名。我正试图用这句话来实现这一点: IFS='/' read -a FILEPATH_ARRAY <<< "$1" 其中,$path_to_target是我需要复制的文件到新位置的结束路径 它不适用的路径名是任何在名称中包含空格的目录,我最终在尝试复制时遇到了问题(因为它没有正确创建)。例如,如果目录是path/to/some/important file which/im/interest/in,则它输出path/to/some/important/f

我试图用
/
字符分隔路径名。我正试图用这句话来实现这一点:

IFS='/' read -a FILEPATH_ARRAY <<< "$1"
其中,
$path_to_target
是我需要复制的文件到新位置的结束路径

它不适用的路径名是任何在名称中包含空格的目录,我最终在尝试复制时遇到了问题(因为它没有正确创建)。例如,如果目录是
path/to/some/important file which/im/interest/in
,则它输出
path/to/some/important/file/which/im/interest/in
作为最终目录名


我需要弄清楚的是如何让IFS只在
/
上分开,并忽略空格。有什么方法可以做到这一点吗?

为以后找到此页面的人解答:

通过在read命令之前设置IFS变量,它只是一个局部更改。变量在find中被分解,但是当我在数组中循环时,空格被分解了,因为IFS恢复为它原来的分隔符

所需更改如下,我的read语句变成以下三行:

OIFS=IFS
IFS='/'
read -a FILEPATH_ARRAY <<< "$1"
把它放回去,这样就不会把其他事情弄糟了


希望我在这个问题上的挫折能在将来帮助别人

为以后找到此页面的人解答:

通过在read命令之前设置IFS变量,它只是一个局部更改。变量在find中被分解,但是当我在数组中循环时,空格被分解了,因为IFS恢复为它原来的分隔符

所需更改如下,我的read语句变成以下三行:

OIFS=IFS
IFS='/'
read -a FILEPATH_ARRAY <<< "$1"
把它放回去,这样就不会把其他事情弄糟了


希望我在这个问题上的挫折能在将来帮助别人

分割阵列的命令正确:

set -- "path/to/some/important file which/im/interested/in"
IFS='/' read -a FILEPATH_ARRAY <<< "$1"


很少需要在单个命令之外更改
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"
}
#子shell

(IFS=/;read-a myarray分割数组的命令正确:

set -- "path/to/some/important file which/im/interested/in"
IFS='/' read -a FILEPATH_ARRAY <<< "$1"


很少需要在单个命令之外更改
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"
}
#子shell

(IFS=/;read-a myarray我无法重现您的问题。您是否考虑过使用类似的符号替换空格,然后再次删除它作为临时解决方法?不幸的是,我无法控制文件名,因此我无法做到这一点,幸运的是,我将为发现此页面存在相同问题的任何其他人发布一个答案s我能够修复它。我无法重现您的问题。您是否考虑过用一些符号替换空格,如-然后再次删除它作为临时解决方法?不幸的是,我无法控制文件名,因此我无法做到这一点,幸运的是,我将为发现此页面与相同问题的任何其他人发布一个答案我能够修复它。在对它进行迭代时,您可能没有正确引用数组扩展。我同意@chepner——如果您做得正确,您不需要进行此更改。显示更多代码,我们可以提供更好的修复。(通过“更好”--有一些具体的错误,在扩展时引用可以修复,但在扩展时设置IFS值却无法修复;例如,请查看包含文字的数组元素发生了什么,请记住,
mkdir-p'/tmp/*/hello'
是一个完全有效的命令)。在迭代时,您可能没有正确引用数组扩展。我同意@chepner的说法——如果您做得对,就不需要进行此更改。显示更多代码,我们可以提供更好的修复。(通过“更好”--有一些具体的错误,在扩展时引用可以修复,但在扩展时设置IFS值却无法修复;例如,请查看包含文字的数组元素发生了什么情况(请记住,
mkdir-p'/tmp/*/hello'
是一个完全有效的命令)。
# 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"
}