【问题标题】:Weird behavior when concatenate string in bash shell [duplicate]在bash shell中连接字符串时的奇怪行为[重复]
【发布时间】:2017-02-18 13:35:32
【问题描述】:

我有一个文件存储版本信息,我编写了一个 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 有关,但我不知道如何修复它。

有人知道为什么会这样吗?

【问题讨论】:

标签: bash shell sed


【解决方案1】:

您遇到此问题是因为在 version 文件的每一行中都存在 DOS 行结尾,即 \r

首先使用dos2unixsed 命令删除\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

【讨论】:

  • 你是对的,版本文件是在Windows中生成的。谢谢!
【解决方案2】:

替代解决方案,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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    相关资源
    最近更新 更多