3

サーバーにデプロイされた Web アプリケーションがあります。アプリケーションと共にデプロイされたプロパティ ファイルから Web アプリケーションの現在のバージョンを読み取るスクリプトを作成しようとしています。

ファイルは次のようになります。

//other content
version=[version number]
build=[buildnumber]
//other content

次のような変数を作成したいと思います。version-buildnumber

これが私のスクリプトです:

VERSION_FILE=myfile

VERSION_LINE="$(grep "version=" $VERSION_FILE)"
VERSION=${VERSION_LINE#$"version="}
BUILDNUMBER_LINE=$(grep "build=" $VERSION_FILE)
BUILDNUMBER=${BUILDNUMBER_LINE#$"build="}
THEVERSION=${VERSION}-${BUILDNUMBER}

奇妙なことに、これは場合によっては機能しますが、他の場合には機能しません。私が得る問題は、文字列を連結しようとしているときです(つまり、上記の最後の行)。場合によっては完全に機能しますが、他の文字列の文字は、後で配置されるのではなく、別の文字列の文字に置き換えられます。

次の場合は機能しません。

  • デプロイされたファイルから読み取ると
  • 展開されたファイルを別の場所にコピーして、そこから読み取ると

次の場合に機能します。

  • ファイルをゼロから書き込み、そのファイルから読み取る場合。
  • 独自のファイルを作成し、展開されたファイルから作成したファイルにコンテンツをコピーするとします。

これはとても奇妙だと思います。これを認識している人はいますか?

4

2 に答える 2

1

これを考えるとfoo.txt

//other content
version=[version number]
build=[buildnumber]
//other content

次を使用すると、バージョンビルド文字列をより簡単に抽出できますawk

awk -F'=' '$1 == "version" { version = $2}; $1 == "build" { build = $2}; END { print version"-"build}' foo.txt

スクリプトが機能しない理由がわかりません。誤った出力の例を挙げていただけますか?

この文から:

場合によっては完全に機能しますが、他の文字列の文字は、後で配置されるのではなく、別の文字列の文字に置き換えられます。

実際に何が起こっているのか理解できません (私は英語を母国語としないので、おそらく私のせいです)。

乾杯、ジャコモ

于 2012-05-07T12:34:22.697 に答える
1

ファイルに改行が含まれている可能性があります。ファイルで実行することで修正できdos2unixます。

取得している文字列でオンザフライで実行できる場合もあります。

いくつかの方法を次に示します。

sedの代わりにそれを行うgrep

VERSION_LINE="$(sed -n "/version=/{s///;s/\r//g;p}" $VERSION_FILE)"

また、「バージョン =」を削除するために Bash パラメーターを展開する必要はありません。

また

grep現在と同じように実行し、2 番目のパラメーター展開を実行してキャリッジ リターンを取り除きます。

VERSION=${VERSION_LINE#$"version="}
VERSION=${VERSION//$'\r'}

ちなみに、名前の衝突の可能性を減らすために、小文字または大文字と小文字が混在する変数名を習慣的に使用することをお勧めします。

于 2012-05-07T13:57:55.027 に答える