2012-07-10 65 views
4

我無法使用IFS將我的字符串轉換爲數組。下面是我爲我的字符串:打擊字符串與IFS的陣列

"Jun01 Jun02 Jun03 Jun04 Jun05 ..." #in that format, separated by spaces 

這裏是我曾嘗試代碼:

IFS=" " #set it to space character 
DATES_ARRAY=($DATES_STRING) #from above 
echo ${DATES_ARRAY[0]} #output is empty 

然而,當我刪除I​​FS行它的工作原理。但是我用了幾行來打印出默認的ASCII值,我得到了'32'這意味着'空格'字符。作爲一名強迫症程序員,我想自己設定一下,以保證安全......我不知道如何預先設置它!

那麼爲什麼試圖設置IFS手動空間不工作?

+1

你的代碼在bash v3.2.25上工作,你使用的是什麼語言環境? – bobah 2012-07-10 17:25:25

+0

不知道,我怎麼知道? – JDS 2012-07-10 17:30:17

+1

適用於GNU bash,版本4.2.29。嘗試放置像'''的空間,看看它是否有任何區別。 – Jite 2012-07-10 17:37:50

回答

5

它確實有效,但無論如何它是不必要的,因爲默認情況下空間保證在IFS中。不要手動設置。這樣做可能會導致問題。

基本上,絕對不要在Bash中使用分詞。有時需要咬住子彈並使用它,如果使用非常小心的話,限於POSIX sh。如果您要設置IFS,請將其設置在少數幾個有影響的命令之一的環境中,或者在最多的地方設置爲一個函數。

你永遠不會需要使用這個,所以我不會解釋一切:

$ printf -v str '%s ' Jun{01..10} 
$ set -f 
$ IFS=' ' declare -a 'arr=($str)' 
$ declare -p arr 
declare -a arr='([0]="Jun01" [1]="Jun02" [2]="Jun03" [3]="Jun04" [4]="Jun05" [5]="Jun06" [6]="Jun07" [7]="Jun08" [8]="Jun09" [9]="Jun10")' 

IFS設置爲空間冗餘這裏展現它的工作原理。

也許從字符串到數組的最正確的方法是使用read。很多例子here

的cannonical方法是:

read -ra arr <<<"$str" 

其中IFS可選在read環境作爲分隔符,如果它是除空白,什麼設置。

1

默認$IFS是使用空白作爲標記分隔符,包括製表符和換行符。

試試這個:

echo "$IFS" | cat -vte 

如果你沒有改變$IFS,輸出應該是:

^I$ 
$ 

這是一個空格,然後通過一個單一的標籤:^I和一個換行符 - 請注意,cat正在打印任何換行符$

所以你的腳本摘錄應該沒有觸及$IFS工作。

+1

好吧,但我不明白爲什麼試圖將其設置爲空間我自己不工作。很高興知道默認設置是什麼。 – JDS 2012-07-10 17:24:59

+0

'cat -te'相當於'cat -vTE',所以你可以跳過'-v'。 – 2012-07-10 17:25:26

+0

@YoungMoney你的代碼也適用於我,bash版本3.2.48 – pb2q 2012-07-10 17:30:17

4

我建議不要單獨使用$IFS來分詞,因爲設置和恢復$ IFS是一件痛苦的事情。所以你完全知道它是什麼

DATES_STRING='Jun01 Jun02 Jun03 Jun04 Jun05' 

IFS=' ' read -a DATES_ARRAY <<< "$DATES_STRING" 

我也建議明確設定$IFSread的環境:使用這樣的事情。

+1

那應該是'read -r -a' – 2013-05-09 03:13:37

+2

這不會改變IFS的任何方式嗎? – Prospero 2013-12-10 21:17:08