我有一个奇怪的问题,我不知道为什么。我相信它可能与命令替换有关,但我没有足够的经验来理解为什么。
以此脚本为例:
#!/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的值中硬编码,我会得到预期的结果。有人可以向我解释我在这里做错了什么吗?谢谢。
答案 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\r
且MINOR_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')