スクリプトを介してプロパティファイルを読み取るには?

スクリプトを介してプロパティファイルを読み取るには?

私は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"

おすすめ記事