2013-05-14 231 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