2016-10-10 6 views
1

ファイルストアのバージョン情報があり、2つのフィールドを読み込んで結合するシェルを作成しました。しかし、私がこれらの2つのフィールドを連結すると、それは私には致命的な結果を示しています。bashシェルで文字列を連結するときの奇妙な動作

バージョンのファイル:

buildVer = 3 
version = 1.0.0 

ようなスクリプトが見えます:出力は、私は、ファイルからの読み込みせずに直接sdk_verをエコーするためにこの作品を試してみました

1.0.0 
3 
.30.0 

を示し

#!bin/bash 

verFile='version' 
sdk_ver=`cat $verFile | sed -nE 's/version = (.*)/\1/p'` 
build_ver=`cat $verFile | sed -nE 's/buildVer = (.*)/\1/p'` 
echo $sdk_ver 
echo $build_ver 
tagname="$sdk_ver.$build_ver" 
echo $tagname 

スクリプトのうまく動作します。だから私はそれはsedに関連するかもしれないと思うが、私はそれを修正する方法を見つけることができませんでした。

誰もがそのように動作する理由を知っていますか? awk

+0

あなたの主な問題ではありませんが、そこに[猫の役に立たない使い方](http://stackoverflow.com/a/16619430/253056)という2つの例があります。 –

答えて

2

あなたは理由versionファイルの各行で、すなわち\rを終了DOSラインの存在により、この問題を取得しています。

使用dos2unixまたはこのsedコマンドは削除する\r最初:これは出力が得られます

#!/bin/bash 

while IFS='= ' read -r k v; do 
    declare $k="$v" 
done < <(sed $'s/\r//' version) 

tagname="$version.$buildVer" 
echo "$tagname" 

ところで

sed -i 's/\r//' version 

あなたも、純粋なBASHを使用してスクリプトを簡素化することができますが、このように構築

1.0.0.3 
+1

あなたが正しいです、バージョンファイルはWindowsで生成されます。ありがとう! – 2power10

0

代替ソリューション、:

awk '/version/{v=$3} /buildVer/{b=$3} END{print v "." b}' version.txt 

例:

$ cat file.txt 
buildVer = 3 
version = 1.0.0 

$ awk '/version/{v=$3} /buildVer/{b=$3} END{print v "." b}' file.txt 
1.0.0.3 
関連する問題