将参数传递给输入文件的 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 脚本
如何通过 docker run 将参数传递给 Shell 脚本