私はbashシェルを使用しています。プロパティファイルを読み込み、ファイルから読み取ったキーと値のペアに基づいて他のファイルでいくつかの置換を実行するスクリプトを作成しようとしています。だから私は持っています
#!/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"
ただし、ファイルを実行しようとすると、ファイルが存在するにもかかわらず、「該当するファイルまたはディレクトリエラーはありません」というメッセージが表示されます(確認後に「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
プロパティファイルを正常に読み取るにはどうすればよいですか?
答え1
エラーはすぐそこにあります:
=: 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
。 (シェルはコマンドの引数が何であるかを問わず、等号を引数として使用することがあるかもしれません。)今やfile
、ファイル形式を識別するプログラム、まさにそのことをします。まず、openを試みると=
エラーが発生し、openを試す/tmp/countries.properties
とエラーが何であるかがわかります。
/tmp/countries.properties: ASCII text
もう1つはNo such file or directory
リダイレクトで発生します< $file
。変数に値が割り当てられていないため、リダイレクトは機能しません。
シェルの割り当て要件は次のとおりです。いいえフラグの周りにスペースがあるので、=
次のようになります。
file=/tmp/countries.properties
またこちら:
sed -ie 's/:iso=>"${key}"/:iso=>"${key}",:alpha_iso=>"${value}"/g'
変数は一重引用符で拡張されず、2番目の引数全体を変数で囲み、変数の内容ではなくsed
リテラルを取得します。${key}
変数を拡張するには、変数を一重引用符で終わるか、文字列全体に二重引用符を使用します。
sed -ie 's/:iso=>"'${key}'"/:iso=>"'${key}'",:alpha_iso=>"'${value}'"/g'
sed -ie "s/:iso=>\"${key}\"/:iso=>\"${key}\",:alpha_iso=>\"${value}\"/g"
答え2
努力する:
file="/tmp/countries.properties"