如何在Bash/Shell脚本中传递含特殊字符的动态变量参数
解决Jenkins流水线传递含特殊字符密码的问题
问题原因
直接使用sh "./script-test.sh $dbpassword"时,shell会解析变量中的特殊字符:
#会被当作注释起始符,导致其后的所有内容被忽略!会触发shell的历史命令扩展
最终脚本实际收到的参数为空。
解决方案
1. Jenkins流水线中正确传递参数
在Jenkins的sh步骤中,通过包裹变量避免shell解析特殊字符,两种可行写法:
# 写法1:用单引号包裹密码变量 sh './script-test.sh '"'$dbpassword'"'
# 写法2:用双引号转义包裹 sh "./script-test.sh \"$dbpassword\""
核心是让shell把完整的密码字符串作为单个参数传递,不会拆解或忽略特殊字符。
2. 脚本内正确接收并使用参数
在script-test.sh中,用$1接收密码参数,调用sqlplus时用双引号包裹密码,避免sqlplus解析特殊字符:
#!/bin/bash DB_PASSWORD="$1" # 调用sqlplus的正确格式 sqlplus username/"$DB_PASSWORD"@your_database
验证
执行流水线后,脚本会完整接收#!2323qwq作为参数,sqlplus可正确识别该密码完成登录。
内容的提问来源于stack exchange,提问作者gaurav sharma
相关产品推荐
相关产品推荐

