bash
2017-02-11 5 views 1 likes 
1

私は奇妙な問題を抱えています。なぜその理由がわかりません。私はそれがコマンド置換に関連するかもしれないと信じていますが、私はなぜそれを理解するのに十分な経験がありません。コマンド置換を文字列連結で使用するにはどうすればよいですか?

は、例えば、このスクリプトを取る:

#!/usr/bin/env bash 

MAJOR_VER="$(grep "version.major" application.properties | cut -d'=' -f2)" 
MINOR_VER="$(grep "version.minor" application.properties | cut -d'=' -f2)" 
PATCH_VER=3 

echo ${MAJOR_VER} 
echo ${MINOR_VER} 
echo ${PATCH_VER} 

echo "${MAJOR_VER}.${MINOR_VER}.${PATCH_VER}" 

私は結果を取得しています:

1 
2 
3 
.3 

だから、最初の3つのエコーの呼び出しは、正しい情報を与えています。しかし、私はそれらを一緒に連結しようとするたびに、私は最後のものを表示するだけです。私は、MAJOR_VERとMINOR_VERの値をハードコードすると期待される結果が得られるので、これはコマンド置換に直接関係していると推測します。誰かがここで間違っていることを私に説明してもらえますか?ありがとう。

答えて

1

ファイルapplication.propertiesには、dos行末があります。それを変換します

dos2unix application.properties 

は実験を守ってください。application.properties\r\nの代わり\nで終わる行を持っているので、

$ cat script.sh 
#!/usr/bin/env bash 

MAJOR_VER="$(grep "version.major" application.properties | cut -d'=' -f2)" 
MINOR_VER="$(grep "version.minor" application.properties | cut -d'=' -f2)" 
PATCH_VER=3 

echo ${MAJOR_VER} 
echo ${MINOR_VER} 
echo ${PATCH_VER} 

echo "${MAJOR_VER}.${MINOR_VER}.${PATCH_VER}" 

$ cat application.properties 
version.major=1 
version.minor=2 

$ cat -A application.properties 
version.major=1^M$ 
version.minor=2^M$ 

$ ./script.sh 
1 
2 
3 
.3 

$ ./script.sh | cat -A 
1^M$ 
2^M$ 
3$ 
1^M.2^M.3$ 

$ dos2unix application.properties 
dos2unix: converting file application.properties to Unix format ... 

$ ./script.sh 
1 
2 
3 
1.2.3 
1

は、これはおそらくです。変数には末尾に\rが含まれています。つまり、MAJOR_VERの値は1\rであり、値はMINOR_VERです。2\rです。 echoと入力すると、\rは文字の位置から行の先頭にリセットされるため、echo "1\r.2\r.3"の出力は.3として出力されます。

あなたはtr -dを使用して\rを削除できます。

MAJOR_VER=$(grep "version.major" application.properties | cut -d'=' -f2 | tr -d '\r') 
MINOR_VER=$(grep "version.minor" application.properties | cut -d'=' -f2 | tr -d '\r') 
+0

恐ろしいです。ありがとうございました! – Sam

関連する問題