将参数传递给输入文件的 shell 脚本

Posted

技术标签:

【中文标题】将参数传递给输入文件的 shell 脚本【英文标题】:shell script to pass argument to input file 【发布时间】:2022-01-23 19:25:26 【问题描述】:

我有一个 shell 脚本,它从用户那里获取一些输入并将该输入传递给我在我的 shell 脚本中使用的文件

Shell 脚本myscript.sh

kubectl create -f de_pod.yaml

这里是de_pod.yaml

apiVersion: v1
kind: Pod
metadata:
    name: test
spec:
    restartPolicy: Never

    containers:
    -   name: run-esp
        image: myimage:1
        command: ["python", "/script.py", "$Input1", "$input2"]
        imagePullPolicy: Always
        stdin: true
        tty: true


这就是我运行脚本的方式

sh myscript.sh my1stinput my2ndinput

如果您在command: ["python", "/script.py", "$Input1", "$input2"] 行查看de_pod.yaml,我在运行myscript.sh 后使用用户输入。但$input1$input2 都没有填充我的值

我做错了什么?

【问题讨论】:

如果你的shell脚本真的只有kubectl那一行,那么你根本就没有在脚本中提到这些参数吗?此外,即使纠正了这一点,它也不会神奇地使这些变量在 YAML 文件中可用。 如果您不向我们展示脚本,我们怎么知道? @Raxi,shell 脚本新手,您能帮帮我吗? 我在下面的答案中发布了一种可能的方式。 @Raxi 我收到错误did not find expected '-' indicator。在你的回答中,我看到你写了``` kubectl create -f -``` 这里- 是什么? 【参考方案1】:

我怀疑你想要的是这样的。

myscript.sh

#!/bin/bash
[[ "$#" -ne 2 ]] && 
    echo "Usage: $0 <something_something> <something_else>" 1>&2;
    exit 1;
;
template="/path/to/de_pod.yaml";
my1stinput=""; printf -v my1stinput '%q' "$1";
my2ndinput=""; printf -v my2ndinput '%q' "$2";
sed -e "s/\$Input1/$my1stinput/g" -e "s/\$Input2/$my2ndinput/g" "$template" | kubectl create -f - ;

如果 2 个参数中的值是复数,则应额外考虑确保它们在 sed 模式中正确转义。

【讨论】:

【参考方案2】:

不是最好的解决方案,但如果您想以这种方式使用 pod 部署,那么它应该可以工作。 生成不同参数的yaml文件,通常使用Helm图表

apiVersion: v1
kind: Pod
metadata:
    name: test
spec:
    restartPolicy: Never

    containers:
    -   name: run-esp
        image: myimage:1
        command: ["python", "/script.py", "input1", "input2"]
        imagePullPolicy: Always
        stdin: true
        tty: true

kubectl create -f de_pod.yaml | sed "s/input1/$1/g" | sed "s/input2/$2/g"

【讨论】:

以上是关于将参数传递给输入文件的 shell 脚本的主要内容,如果未能解决你的问题,请参考以下文章

将参数输入参数传递给批处理文件

使用 argparser 将参数传递给入口点 python 脚本

如何将参数传递给 shell 脚本? [复制]

如何通过 docker run 将参数传递给 Shell 脚本

如何将多个参数传递给 shell 脚本到`kubectl exec`?

如何将命令行参数传递给 spark-shell scala 脚本?