2

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

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

结果变成

/XXX/XXX/XXX/subdir1
/XXX/XXX/XXX/subdir2

似乎 bash 自动更改Blankspace\n. 这真的让我很困扰。有没有办法改\n回来Blankspace?我的系统是 Mac OS X 版本 10.7.5。

4

2 回答 2

7

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

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

(如果在保存其“值”之前未设置,则无法恢复IFS到未设置状态,但这可能不值得在这里讨论。)

于 2013-05-14T13:20:48.317 回答
1

当您需要更改时IFS,在子外壳中进行更改通常很有帮助。然后,当子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
于 2013-05-14T22:19:13.697 回答