好的,有类似的问题,但不完全是我想要的。
我正在使用 Kubernetes,所以信息来自于此,但这个问题是针对 Shell 脚本的,所以请不要把我推给 Kubernetes 人员。 :)
我运行以下命令来获取信息:
kubectl get pods -o wide --all-namespaces | grep sonarqube-
结果示例:
default sonarqube-664b4fd48-g6nvb 1/1 Running 0 4d 10.233.64.6 local-node-0
目标:我想要的是获取前 2 个值(default
和sonarqube-664b4fd48-g6nvb
)并将它们转换为可以在脚本中其他地方使用的变量。
我想使用变量的命令示例如下:
kubectl cp <file> ${namespace}/${deployment}:/opt/app/extensions/plugins/
谢谢,如果需要更多信息,请告诉我。
答案1
和巴什的read
功能:
read -r namespace deployment other < <(kubectl get pods -o wide --all-namespaces | grep sonarqube-)
kubectl cp <file> "${namespace}/${deployment}:/opt/app/extensions/plugins/"
答案2
一般来说
在其他 shell 中有效的bash
是从管道的输出设置位置参数:
set -f -- $(kubectl get pods -o wide --all-namespaces | grep sonarqube- )
在这种情况下,您现在可以访问变量,如$1
、$2
等。
专门针对 bash
可以bash
创建一个数组变量,如下所示:
var=( $(kubectl get pods -o wide --all-namespaces | grep sonarqube- ) )
习惯用法是var=( ... )
,在本例中是管道的输出grep
。
然后,您可以使用 形式 访问数组的元素${var[n]}
,从零开始n
。
答案3
在这种情况下(具有可预测的输出列),我通常会使用 awk。像这样的东西可能会有用:
kubectl get pods -o wide --all-namespaces | awk '/sonarqube-/ { cmd=sprintf("kubectl cp <file> %s/%s:/opt/app/extensions/plugins", $1, $2); print(cmd); system(cmd); }'