在Mac OS X上更改bash中的$ IFS时

时间:2013-05-14 12:41:01

标签: macos bash

我在Mac OS X上更改了bash中$ IFS的值时遇到了问题。例如,我有一个主目录/XXX/XXX/XXX,以及两个子目录subdir1和{{1 }}。如果我运行shell脚本

subdir2

通常我会得到这样的结果

maindir=/XXX/XXX/XXX;
subdirs=$(find $maindir -type d -maxdepth 1);
echo $subdirs

这两个子目录由/XXX/XXX/XXX/subdir1 /XXX/XXX/XXX/subdir2 分隔。问题是,当我改变Blankspace这样的值时:

$IFS

之后,如果我们再次检查OLDIFS=$IFS; IFS=$'\n'; IFS=OLDIFS;

的值
$subdirs

结果变为

echo $subdirs

bash似乎会自动将/XXX/XXX/XXX/subdir1 /XXX/XXX/XXX/subdir2 更改为Blankspace。这真让我烦恼。是否有将\n更改回\n的解决方案?我的系统是Mac OS X版本10.7.5。

2 个答案:

答案 0 :(得分:7)

您没有正确重置IFS(或首先正确设置OLDIFS):

OLDIFS="$IFS"
IFS=$'\n'
...
IFS="$OLDIFS"

(如果在保存其“值”之前未设置,则无法将IFS恢复为未设置状态,但这可能不值得进入此处。)

答案 1 :(得分:1)

当您需要更改IFS时,在子shell中执行此操作通常很有帮助。然后,当子shell结束时,IFS的修改值消失。一个例子

set -- a b c
echo "main: $*"             # using default value of IFS
( IFS=:; echo "sub:  $*" )  # modify IFS in a subshell
echo "main: $*"             # previous IFS value restored

输出

main: a b c
sub:  a:b:c
main: a b c