动态命令行参数未传递给脚本

问题描述 投票:0回答:1

这是我的管道脚本,我在其中调用一个 shell 脚本并传递参数。在这个 $np 和 $cp 中包含特殊字符,即 # ex: abcdefgh#abd#we23:

def name = 'xyz'
def np = ''
def cp = ''
def pnumber = 'if.com'
def mnumber ='12'
def unumber= 'abc'
pipeline{
 stages{

stage('stage1'){
steps{
  script{
      cp = sh(script: "cat file.txt", returnStdout: true)
      np = sh(script: "cat file2.txt", returnStdout: true)
     }
}

stage('stage2'){
steps{
  script{
      sh "./myscript.sh $name $mnumber $pnumber $unumber $np $cp"
     }
}
}
}

我的脚本在哪里:

#!/bin/bash
name=$1
pnumber=$2
mnumber=$3
unumber=$4
np=$5
cp=$6
sqlplus $unumber/$np/$cp/$unumber/$mnumber/$pnumber<<EOF
  select date/$name;
  exit;
EOF

我得到的管道脚本的输出没有最后一个参数。例如:

./myscript.sh abc xyz 123 User abcdefgh#abd#we23

它没有采用最后一个参数。

请求您帮助让我知道我的脚本出了什么问题。如果需要,我很乐意为您提供任何其他详细信息。 谢谢

bash shell jenkins command-line-arguments
1个回答
0
投票

最简单的是在 shell 端添加单引号,当密码或其他变量中有

'
时再回到问题:

sh "./myscript.sh $name $mnumber $pnumber $unumber '$np' '$cp'"

最可靠的是用环境变量传递所有内容,然后 shell 可以正确引用它。

environment { 
    name = name
    number = number
    pnumber = pnumber
    unumber = unumber
    cp = readFile "file.txt"
    np = readFile "file2.txt"
}
script {
    sh './myscript.sh "$name" "$mnumber" "$pnumber" "$unumber" "$np" "$cp"'
}

或者你可以序列化 ex。到 json 并在 shellscript 中读取它(或者在 python 中,因为它可以导入 json)。

您可能想研究 groovy 字符串插值规则、shell 引用规则和 shell 扩展。 Groovy 插入字符串,然后通过 shell 引用对其进行求值。这是一场噩梦。 https://gist.github.com/Faheetah/e11bd0315c34ed32e681616e41279ef4

那么你的脚本也应该被修复——它缺少引用。将其发布到 shellcheck 并实施建议。

请注意,您的文件可能包含尾随换行符。 Shell 命令替换

$(...)
删除尾随换行符。您可能想在 groovy 或 bash 中删除它们。

© www.soinside.com 2019 - 2024. All rights reserved.