linux-简化语义版本控制脚本
我对应用程序组件进行了语义版本控制,这就是我更新主要版本号然后将其存储回version.txt的方式。对于一个简单的操作来说,这似乎有很多行。有人能帮我把这个剪下来吗?没有使用linux-简化语义版本控制脚本,linux,bash,shell,Linux,Bash,Shell,我对应用程序组件进行了语义版本控制,这就是我更新主要版本号然后将其存储回version.txt的方式。对于一个简单的操作来说,这似乎有很多行。有人能帮我把这个剪下来吗?没有使用bc,因为我所在的docker python映像似乎没有该命令 这是从yml文件中提取的,version.txt仅包含一个主要和次要编号。1.3例如。下面的代码仅更新主编号(1)并将次编号重置为0。所以如果我在1.3上运行代码,我会得到2 - echo $(<version.txt) 1 | awk '{print
bc
,因为我所在的docker python映像似乎没有该命令
这是从yml文件中提取的,version.txt仅包含一个主要和次要编号。1.3例如。下面的代码仅更新主编号(1)并将次编号重置为0。所以如果我在1.3上运行代码,我会得到2
- echo $(<version.txt) 1 | awk '{print $1 + $2}' > version.txt
VERSION=$(<version.txt)
VERSION=${VERSION%.*}
echo $VERSION > version.txt
echo "New version = $(<version.txt)"
-echo$(version.txt
版本=$(VERSION.txt
echo“新版本=$(关于简单性
“Simple”和“short”不是一回事。echo$foo
比echo“$foo”
短,但它实际上做的事情多得多:它将foo
的值在IFS
中的字符上分开,将该拆分的每个结果作为全局表达式进行计算,然后将它们重新组合
类似地,使代码更简单——如中所述,限制它所经历的过程中的步骤数量——与缩短代码完全不是一回事
增加一个片段,而不修改其他片段
如果IFS=.read-r主rest“version.txt.$$”和&mv“version.txt.$$”version.txt
其他的
echo“错误:无法从version.txt中读取版本号”>&2
出口1
fi
递增主版本,丢弃其他版本
如果IFS=.read-r主rest“version.txt.$$”和&mv“version.txt.$$”version.txt
其他的
echo“错误:无法从version.txt中读取版本号”>&2
出口1
fi
根本原因
以上两种都是POSIX兼容的,避免依赖任何未内置到shell中的功能
IFS=.read-r第一秒第三关于简单性
“Simple”和“short”不是一回事。echo$foo
比echo“$foo”
短,但它实际上做的事情多得多:它将foo
的值在IFS
中的字符上分开,将该拆分的每个结果作为全局表达式进行计算,然后将它们重新组合
类似地,使代码更简单——如中所述,限制它所经历的过程中的步骤数量——与缩短代码完全不是一回事
增加一个片段,而不修改其他片段
如果IFS=.read-r主rest“version.txt.$$”和&mv“version.txt.$$”version.txt
其他的
echo“错误:无法从version.txt中读取版本号”>&2
出口1
fi
递增主版本,丢弃其他版本
如果IFS=.read-r主rest“version.txt.$$”和&mv“version.txt.$$”version.txt
其他的
echo“错误:无法从version.txt中读取版本号”>&2
出口1
fi
根本原因
以上两种都是POSIX兼容的,避免依赖任何未内置到shell中的功能
IFS=.read-r first second third坦白说,这不是那么多行。我最担心的不是行数,而是代码不明确的地方--echo$VERSION
,例如,会将未引用的值视为字符串拆分和全局处理的对象。一般来说,在exp可读性、健壮性和c的观念是对错误的事情进行优先排序。向我们展示文件的外观-version.txt
,假设我们需要处理12.43.56
,而不仅仅是12.43
,如果它真的存在的话。我建议将多行脚本作为单个列表项,只是为了明确起见(即,对于来自ansible或其他工具的人员,列表中的每个shell命令都由单独的shell运行)。在前面加一个破折号和空格,然后将后面的所有行缩进,以相同的缩进级别开始。坦率地说,这不是那么多行。我最担心的不是行数,而是代码不明确的地方--echo$VERSION
,例如,将未加引号的值视为字符串拆分和globbing。一般来说,以牺牲可读性、健壮性和c为代价寻找一行代码是错误的。向我们展示文件的外观-version.txt
,如果真的是这样的话,我们可能需要处理12.43.56
,而不仅仅是12.43
。我建议将多行脚本作为一个单一的列表条目,只是为了明确(例如,对于来自ansible或其他工具的人员,列表中的每个shell命令都由单独的shell运行).在前面加一个破折号和空格,然后将后面的所有行缩进,以相同的缩进级别开始。它们似乎删除了最后一个点之后的所有内容。如果它们想从13.2.4
转到14
,那么它就是echo“$(主调+1))“>version.txt
,因此更简单。详细的规范将使您更容易对答案充满信心。感谢您的详细答案!当我在bitbucket管道中运行此命令时:-IFS=.read-r major rest“version.txt”和&mv“version.txt”
I get:mv:version.txt之后缺少目标文件操作数请尝试“mv--help”以获取更多信息。
I删除了if-else语句,因为它必须全部放在bitbucket管道yml文件中的一行上,并且无法读取。如果bitbucket使用真正兼容的YAL,则AML绝对允许多行文字ML解析器,您完全可以将您的文本拆分为多行……也就是说,我的一些代码刚刚被破坏——请查看更新。它们似乎删除了最后一个点之后的所有内容。如果它们想从13.2.4
转到14
,那么它只是echo“$(主要+1))”>version.txt
,因此更简单。详细的规范将使您更容易对答案充满信心。感谢您的详细答案!当我在bitbucket管道中运行此命令时:-IFS=.read-r major rest“version.txt”&
if IFS=. read -r major rest <version.txt || [ -n "$major" ]; then
echo "$((major + 1)).$rest" >"version.txt.$$" && mv "version.txt.$$" version.txt
else
echo "ERROR: Unable to read version number from version.txt" >&2
exit 1
fi
if IFS=. read -r major rest <version.txt || [ -n "$major" ]; then
echo "$((major + 1))" >"version.txt.$$" && mv "version.txt.$$" "version.txt"
else
echo "ERROR: Unable to read version number from version.txt" >&2
exit 1
fi