蓝莓坏了仨 2019-11-22 10:27 采纳率: 0%
浏览 1111

#jenkins #詹金斯 #pipeline 脚本中执行linux命令报错:line 2: syntax error near unexpected token `('。

pipeline 脚本中执行linux命令报错:
1. linux命令:sh "python3 /home/pipline/DisasteRecoveryV1.1/main.py ${pool} ${province}"
2. 报错:line 2: syntax error near unexpected token `('。
命令只有1行,且没有"(",还是报了这个错误,为什么啊?
如果将脚本改成:sh 'python3 /home/pipline/DisasteRecoveryV1.1/main.py "${pool}" "${province}"',就不会报错,但是参数又传不进来,两个参数传进来都是空字符。
pipeline script如下:

stage('选择切换省份和资源池') {
    steps{
        script{
                def province = ''
                province = input message: '请选择省份', parameters: [choice(choices: '安徽\n北京\n福建, name: 'provinces')]
                def pool = ''
                pool = input message: '请选择资源', parameters: [choice(choices: '河北\n河南, description: '-', name: 'pool')]
                echo "选择省份:${province},选择资源:${pool}。"
                sh "python3 /home/pipline/DisasteRecoveryV1.1/main.py ${pool} ${province}"
        }

    }
}
  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-29 10:31
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在你的脚本中,你尝试使用input函数来获取用户输入,并将其作为shell命令的参数传递给Python脚本。然而,在Linux系统中,input函数返回的是一个字符串(通常是一个空字符串),而不是真正的输入值。这可能导致你在运行Python脚本时遇到问题。

    为了解决这个问题,你可以尝试以下几种方法:

    1. 使用read函数替代input函数。这样,当你从用户那里读取数据时,它会自动处理任何潜在的问题。

      steps{
          script{
              def province = read line "请选择省份", parameters: ["choice"]
              def pool = read line "请选择资源", parameters: ["choice"]
              ...
          }
      }
      
    2. 使用变量存储用户的输入。然后,你可以在Python脚本中直接访问这些变量。

      steps{
          script{
              def province = ""
              province = read line "请选择省份", parameters: ["choice"]
              def pool = ""
              pool = read line "请选择资源", parameters: ["choice"]
              ...
          }
      }
      
    3. 尝试使用eval函数来解析用户输入并将其转换为shell命令的参数。这种方法可能会导致更多的错误,因为eval函数本身可能引发其他错误或安全风险。

      steps{
          script{
              def province = eval(read line "请选择省份", parameters: ["choice"])
              def pool = eval(read line "请选择资源", parameters: ["choice"])
              ...
          }
      }
      
    4. 将用户输入直接传递给Python脚本,而不进行任何预处理。这样可以避免在Python脚本内部处理用户输入的额外工作。

      steps{
          script{
              sh "python3 /home/pipline/DisasteRecoveryV1.1/main.py ${pool} ${province}"
          }
      }
      
    5. 如果你确实想要在Python脚本内部处理用户输入,但仍然希望它们以字符串形式出现,那么你可以使用quote函数来转义任何特殊字符,然后再用read函数读取这些转义后的字符串。

      steps{
          script{
              def quoteProvince = quote("${province}")
              def quotePool = quote("${pool}")
              sh "python3 /home/pipline/DisasteRecoveryV1.1/main.py $quotePool $quoteProvince"
          }
      }
      
    6. 如果你已经知道用户输入的内容是有效的,你可以考虑使用更安全的方法,例如创建一个专门用于存储用户输入的文件,并在脚本开始时检查文件是否存在。如果不存在,就提示用户重新输入。

      if ! test -f /tmp/input.txt; then
          touch /tmp/input.txt
          read line "请输入省份和资源,请确保输入有效:" > /tmp/input.txt
          rm /tmp/input.txt
      fi
      
      steps{
          script{
              def quoteProvince = quote("${province}")
              def quotePool = quote("${pool}")
              sh "python3 /home/pipline/DisasteRecoveryV1.1/main.py $quotePool $quoteProvince"
          }
      }
      

    以上是一些可能解决这个问题的方法。根据具体情况,你应该选择最适合你的需求的方法。

    评论

报告相同问题?