我在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。
答案 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