如何使用命令替换来处理字符串连接?

时间:2017-02-11 15:48:32

标签: bash

我有一个奇怪的问题,我不知道为什么。我相信它可能与命令替换有关,但我没有足够的经验来理解为什么。

以此脚本为例:

#!/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

所以前三个回音调用正在给出正确的信息;但是,每当我尝试将它们连接在一起时,我只会显示最后一个。我猜这与命令替换直接相关,因为如果我在MAJOR_VER和MINOR_VER的值中硬编码,我会得到预期的结果。有人可以向我解释我在这里做错了什么吗?谢谢。

2 个答案:

答案 0 :(得分:1)

文件application.properties有dos行结尾。转换为:

dos2unix application.properties

观察实验:

$ 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 :(得分:1)

这可能是因为application.properties的行以\r\n而不是\n结尾。会发生什么变量是变量在其末尾包含\r,即MAJOR_VER的值为1\rMINOR_VER的值为2\r。当您echo时,\r会将字符位置重置为该行的开头,因此echo "1\r.2\r.3"的输出将打印为.3

您可以使用\r删除tr -d

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')