2013-10-13 38 views
0

我想寫一個bash函數,我可以定期從更大的一組腳本中調用。我想通過這個函數的名稱包含文本字符串的一個普通列表的文件:Bash函數參數分配讀取文件(列表)並寫入文件(數組)

blue 
red 
green 

...和具備的功能寫出這些字符串到不同的文件(其名稱也作爲傳遞參數在bash兼容的數組形式的功能):

[Bb]lue [Rr]ed [Gg]reen 

我不能得到的功能(內部)認識到輸出文件的名稱傳遞。它會拋出一個「模棱兩可的重定向」錯誤,然後出現一堆「沒有這樣的文件或目錄」錯誤。但是,它正在處理輸入文件確定。問題出現在我如何將參數分配給函數中的本地字符串。不幸的是,我已經改變了函數中的loc_out=這麼多次,以至於我不能再回憶我嘗試過的所有表單。希望這個例子很明顯,如果不是最佳做法:

process_list() { 
    # assign input file name to local string 
    loc_in=(${1}); 
    # assign output file name to local string 
    loc_out=($(<${2})); # this is not right 
    while read line 
    do 
     echo "loc_out before: $loc_out"; 
     echo "loc_in term: $line"; 
     item_length=${#line}; 
     # loop until end of string 
     for ((i=0; i<$item_length; i++)); 
     do 
      echo "char $i of $line: ${line:$i:1}"; 
      # write out opening bracket and capital 
      if [ ${i} -eq 0 ]; then 
       echo -e "[" >> $loc_out; 
       echo -e ${line:$i:1} | tr '[:lower:]' '[:upper:]' >> "${loc_out}"; 
      fi; 
      # write out current letter 
      echo -e ${line:$i:1} >> "${loc_out}"; 
      # write out closing bracket 
      if [ ${i} -eq 0 ]; then 
       echo -e "]" >> "${loc_out}"; 
      fi; 
     done;  
     # write out trailing space 
     echo -e " " >> "${loc_out}"; 
     # check the output file 
     echo "loc_out after: ${loc_out}"; 
    done < $loc_in; 
} 
f_in="/path/to/colour_list.txt"; 
f_out="/path/to/colour_array.txt"; 
echo "loc_in (outside function): ${loc_in}"; 
echo "loc_out (outside function): ${loc_out}"; 
process_list $f_in $f_out; 

任何幫助我做錯了將不勝感激。

+0

'$(<$ {2})'假設$ 2是一個文件名,這表示打開文件並將文件的所有內容放在您的shell腳本中。我不認爲這就是你想要做的。祝你好運。 – shellter

+0

謝謝@shellter。我在最初分配函數頭部的文件句柄和稍後在函數底部附近回顯此文件的內容之間感到困惑。第二個最後的函數行應該在$(<$ {loc_out})「;'之後讀取'echo」loc_out。 – oweng

回答

0

變化:

loc_out=($(<${2})); # this is not right 

要這樣:

loc_out=(${2}); # this should be right 

你想在該行只是文件名。

希望這能解決您的問題。

編輯:

除此之外,您還可以/應該這樣寫:

loc_in=${1}; 
loc_out=${2}; 

你不需要括號,因爲據我所知。

+0

謝謝。我確信我嘗試過,但顯然不是。在我的示例中還有一些其他錯誤,我明顯地介紹了它,即'echo'重定向到'$ loc_out'應該使用'-ne'而不是'-e',並且開放方括號echo應該有' 「$ {} loc_out」'。 – oweng

相關問題