2013-05-14 162 views
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。

+0

用'什么;'行终止? – trojanfoe 2013-05-14 12:44:53

+0

';'可以被删除。 – 2013-05-14 12:48:17

回答

7

你没有正确复位IFS(或正确摆在首位设置OLDIFS):

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

(这无法还原IFS未设定状态,如果它未设置前保存它的“价值” ,但这可能不值得进入此处。)

+0

是的,你是对的。这是我的错误。 – 2013-05-14 13:43:20

1

当您需要更改IFS时,在子外壳中执行此操作通常很有帮助。然后,当子外壳结束时,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