2011-03-07 33 views
1

我在shell腳本中使用IFS變量來解析某些數據(數據已經以給定格式提供給我)。由於默認IFS是空格/製表符/等,我使用字符'¬'分隔輸入文件行中的字段。該數據是一樣的東西腳本中的IFS變量問題使用Unicode

14352345¬AFSFDG1234¬text¬(http://www.google.com,3)(http://www.test.com,2)¬(www.test2.com,4)¬123-23432 

我創建了一個腳本,管道文件到使用IFS變量使用while循環:

#!/bin/bash; 
while IFS=¬ read -r sessionId qId testResults realResults queryId; 
do echo $sessionId; done < inputFile 

(這個循環裏面我做一些實際的awk處理與另一文件)。

發生什麼事是,如果我手動運行這個文件(只是./file),它完美的工作。如果我將它作爲腳本(cron)的一部分或在另一個腳本中運行,我會得到解析錯誤,這表明我的IFS變量未被使用。我試着拷出舊的IFS變量並在解析後重置,以及傳入IFS變量的不同方式(¬,'¬',$'¬'等,但似乎沒有幫助)。

任何指針/提示將不勝感激。


更新:經過一些額外的調試,原來的問題是awk的語句,而不是分隔

回答

5

你要麼有使用Unicode問題或與外殼你想使用,前者更可能。

您選擇作爲分隔符的字符(¬)位於ASCII集外部,並且可以(通常)由計算機以兩種不同方式表示:或者它將被編碼爲latin1或類似字符,其中字符佔據一個八位字節,或者它將被編碼爲UTF-8並使用兩個八位字節。還有其他的可能性,但這兩個最有可能,所以忍受着我。

如果您保存的腳本編碼爲UTF-8,並且您嘗試在非Unicode區域設置中運行該腳本,則shell會將兩個(錯誤)字符作爲分隔符而不是一個。爲了測試這個,嘗試使用ascii字符作爲分隔符,例如~

如果您發現使用~有效,您必須查看系統的全局配置,並確保在用於創建腳本的環境中區域設置相同,因爲它是在腳本運行的環境中。您可以執行此命令執行locale命令。您可以創建在一個文件中運行此命令和存儲其輸出的腳本:

#!/bin/sh 
locale > /tmp/locale-env 

然後你把它從cron運行,例如,看一看在/tmp/locale-env文件。將它的內容與locale的輸出進行比較,當您從交互式shell運行它時。根據您的分佈情況,您可以將您的全球語言環境設置爲/etc/environment/etc/profile或其他位置。您不妨去UTF-8系統範圍:

LANG=en_US.UTF-8 
export LANG 

這是一個陷阱,我們的國際用戶往往知道的比講英語的要好,因爲ASCII和UTF-8是完全爲英文字符相同,這些問題往往不被注意到。

+1

謝謝你。我實際上採取了不同的建議,並使用了一些非Unicode分隔符! – DOS 2011-03-07 14:49:19