shell脚本变量字符串拼接的一个坑
背景问题发生在jenkins持续集成的打包脚本上,我们需要将数据库脚本按照不同条件抽取出来,放到不同的文件夹下。问题分析要实现这个需求,其中自然少不了条件判断,其中有一段代码:if [-d "$tempPath/$VERSION/$VERSION_$vstandard" ]; then它的逻辑是,如果存在标准(standard)的脚本目录,则需要做一段逻辑。你能看出这个语句有什么问题吗?是的,它的
背景
问题发生在jenkins持续集成的打包脚本上,我们需要将数据库脚本按照不同条件抽取出来,放到不同的文件夹下。
问题分析
要实现这个需求,其中自然少不了条件判断,其中有一段代码:
if [ -d "$tempPath/$VERSION/$VERSION_standard" ]; then
它的逻辑是,如果存在标准(standard)的脚本目录,则需要做一段逻辑。你能看出这个语句有什么问题吗?
是的,它的字符串拼接的方式错了,就是这句$VERSION_standard
。它本来的含义是在变量$VERSION
后面拼接一个字符串,如V1.0.0_standard,而写成$VERSION_standard
意味着要找名称为VERSION_standard
的变量,结果是为空的。
我们通过Linux黑窗口来测试一下:
我们可以看到$VERSION_standard
输出的结果是空的,并没有得到V1.0.0_standard
的结果,而采用${VERSION}_standard
的形式,得到了我们想要的结果。
这段错误代码导致的结果是,不论是否存在
${VERSION}_standard
文件夹,只要存在上一级文件夹$tempPath/$VERSION
,if里面的判断就为真,这就产生了错误的结果
总结一下字符串拼接常用方案
就以上面说的$VERSION
变量与_standard
字符串拼接的例子说明。
1、采用${VERSION}_standard
的形式,通过{}限定变量的范围。
2、采用$VERSION"_standard"
的形式,通过“”限定字符串的范围。
3、采用$VERSION$type
的形式,定义一个type变量,值为_standard,将两个变量连接,两个变量之间不要有空格。
4、融会贯通之后,当然,你也可以采用$VERSION"_"$type
进行字符串拼接了,自由组合。
你学会了吗?
更多推荐
所有评论(0)