Bash

如何通過腳本讀取屬性文件?

  • March 10, 2017

我正在使用 bash shell。我正在嘗試編寫一個腳本來讀取屬性文件,然後根據它在文件中讀取的鍵值對在另一個文件中進行一些替換。所以我有

#!/bin/bash

file = "/tmp/countries.properties"

while IFS='=' read -r key value
do
 echo "${key} ${value}" 
 sed -ie 's/:iso=>"${key}"/:iso=>"${key}",:alpha_iso=>"${value}"/g' /tmp/country.rb
done < "$file"

但是當我去執行該文件時,我得到一個“Nno such file or directory error”,儘管我的文件存在(我在驗證它之後做了一個“ls”)。

localhost:myproject davea$ sh /tmp/script.sh 
=:                         cannot open `=' (No such file or directory)
/tmp/countries.properties: ASCII text
/tmp/script.sh: line 9: : No such file or directory
localhost:myproject davea$ 
localhost:myproject davea$ ls /tmp/countries.properties 
/tmp/countries.properties

我還需要做什麼才能成功讀取我的屬性文件?

錯誤就在那裡:

=:                         cannot open `=' (No such file or directory)

有東西試圖打開一個名為 的文件=,但它不存在。

/tmp/script.sh: line 9: : No such file or directory

這通常在最後一個冒號之前有文件名,但由於它是空的,似乎有些東西試圖打開一個空名稱的文件。

考慮這一行:

file = "/tmp/countries.properties"

執行file帶有參數的命令=/tmp/countries.properties. (shell 並不關心命令的參數是什麼,可能有些東西使用等號作為參數。)現在,file恰好是一個用於辨識文件類型的程序,它只是那。先嘗試打開=,結果報錯,再打開/tmp/countries.properties,告訴你是什麼:

/tmp/countries.properties: ASCII text

另一個No such file or directory來自重定向< $file。由於沒有為變數分配值,因此重定向不起作用。

shell 中的賦值要求符號周圍沒有空格,因此:=

file=/tmp/countries.properties

也在這裡:

sed -ie 's/:iso=>"${key}"/:iso=>"${key}",:alpha_iso=>"${value}"/g'

變數不會在單引號內展開,並且您在整個第二個參數周圍都有這些,因此sed將獲得文字${key}而不是變數的內容。

要麼結束單引號來擴展變數,要麼只對整個字元串使用雙引號:

sed -ie 's/:iso=>"'${key}'"/:iso=>"'${key}'",:alpha_iso=>"'${value}'"/g' 
sed -ie "s/:iso=>\"${key}\"/:iso=>\"${key}\",:alpha_iso=>\"${value}\"/g"

引用自:https://unix.stackexchange.com/questions/350381