在bash shell中连接字符串时的奇怪行为

时间:2016-10-10 07:18:24

标签: bash shell sed

我有一个文件存储版本信息,我写了一个shell来读取两个字段并将它们组合起来。但是,当我连接这两个字段时,它会向我显示一个令人讨厌的结果。

版本文件:

buildVer = 3
version = 1.0.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

输出显示

1.0.0
3
.30.0

我试图直接回显sdk_ver而不从文件中读取它,这段脚本效果很好。所以我认为它可能与sed有关,但我无法弄清楚如何修复它。

有谁知道为什么会这样?

2 个答案:

答案 0 :(得分:2)

由于DOS行结尾存在\r文件的每一行version,您就会遇到此问题。

使用dos2unix或此sed命令首先删除\r

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

顺便说一句,您还可以使用纯粹的BASH结构简化脚本:

#!/bin/bash

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

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

这将给出输出:

1.0.0.3

答案 1 :(得分:0)

替代解决方案,awk

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