2014-09-02 27 views
0

我有一個shell腳本讀取數組中的文件。它與RHEL完美協作,但是當我在Ubuntu上運行相同的腳本時,出現錯誤。這是腳本。如何使用shell腳本讀取數組中的文件內容?

file=/root/monitor.txt 
while IFS=',' read -ra line ; do 
     echo -e "export MASTER_IP=${line[2]}" >> ~/.bashrc 
     source ~/.bashrc 
done < $file 

上述腳本在RHEL中完美工作。當我在Ubuntu上運行它,我得到的錯誤是

read: Illegal option -a 
+2

'-a'選項僅用於bash。查看本頁[Unix - 使用Shell數組](http://www.tutorialspoint.com/unix/unix-using-arrays.htm)以供參考。 – fedorqui 2014-09-02 08:25:56

+0

對於純粹的POSIX sh,數組不存在 - 它們是bash,zsh等採用的ksh特性。幸運的是,您不需要它們。 – 2014-09-03 12:06:58

回答

3

read -a是一個bash的功能,但在Ubuntu /bin/shdash,它不支持-a選項。有幾個方法,你可以解決這個問題:

  • 在Ubuntu,只是運行該腳本bash下,通過改變第一線#!/bin/bash(查爾斯·達菲的建議)

  • 而不是read -a ,只要給一個變量列表,如read f1 f2 f3 f4 f5,然後參考字段$f1$f2等。在這種情況下,如果你有超過5場,你需要增加更多的變數,否則$f5將包含的其餘線。

  • 使用awk代替read。 Awk非常適合這種現場處理任務:您可以用awk -F, '{print "export MASTER_IP=" $3}' $file >> ~/.bashrc等替代while循環,然後在末尾處輸入源~/.bashrc

+1

我至少直接提到改變shebang作爲一個選項。 – 2014-09-02 23:18:13

+0

我沒有想到,這是一個更好的解決方案。我編輯了它。謝謝! – benj 2014-09-02 23:22:36

3
while IFS=, read -r _ _ ip _; do 
    printf 'export MASTER_IP=%s\n' "$ip" 
done <"$file" >>"$HOME/.bashrc" 

這是在幾個方面較好:

  • 不需要任何bash化;將在Ubuntu上使用/bin/sh
  • 在整個循環中只打開一次輸出文件,而不是在每次寫入新行時低效地重新打開它。

然而,你可以做的更好 - 提高你的腳本的安全 - 如果你改變它的家當是#!/bin/bash(或/usr/bin/env bash,或以其他適合自己平臺):

#!/bin/bash 
while IFS=, read -r _ _ ip _; do 
    printf 'export MASTER_IP=%q\n' "$ip" 
done <"$file" >>"$HOME/.bashrc" 

因爲這使用%q而不是%s,它也會轉義地址,因此它們不能包含像$(rm -rf $HOME)這樣的惡意內容 - 您可能不希望將其注入到~/.bashrc中。

相關問題