将yaml文件内容存储在shell脚本变量中并维护yaml结构

gg58donl  于 12个月前  发布在  Shell
关注(0)|答案(1)|浏览(146)

我有一个名为file.yaml的yaml文件

apiVersion: route.openshift.io/v1
kind: Route
metadata:
  name: dashboarding-route
spec:
  host: dashboarding-route.domain
  port:
    targetPort: 100
  tls:
    termination: passthrough
  to:
    kind: Service
    name: dashboarding

然后我运行这个命令

template=$(cat "file.yaml" | sed "s/domain/$MYVARVALUE/g")

MYVARVALUE变量值可以是任何值。
在执行此之后,我想在相同的结构作为一个yaml文件的模板变量的值。例如,当我执行echo $template时,我想要的输出是

apiVersion: route.openshift.io/v1
kind: Route
metadata:
  name: dashboarding-route
spec:
  host: dashboarding-route.domain
  port:
    targetPort: 100
  tls:
    termination: passthrough
  to:
    kind: Service
    name: dashboarding

有人能帮我解决这个问题吗?

liwlm1x9

liwlm1x91#

解决方案一:“只需使用普通echo,并在变量周围加上双引号”-Gordon Davidson

$: MYVARVALUE=some-new-domain
$: template=$(cat "file.yaml" | sed "s/domain/$MYVARVALUE/g")
$: echo "$template"

下面是stdout

apiVersion: route.openshift.io/v1
kind: Route
metadata:
  name: dashboarding-route
spec:
  host: dashboarding-route.some-new-domain
  port:
    targetPort: 100
  tls:
    termination: passthrough
  to:
    kind: Service
    name: dashboarding

解决方案二:使用printf代替echo

您可以使用printf而不是echo来保留yaml,如下所示:

$: MYVARVALUE=some-new-domain
$: template=$(cat "file.yaml" | sed "s/domain/$MYVARVALUE/g")
$: printf '%s\n' "$template"

下面是stdout

apiVersion: route.openshift.io/v1
kind: Route
metadata:
  name: dashboarding-route
spec:
  host: dashboarding-route.some-new-domain
  port:
    targetPort: 100
  tls:
    termination: passthrough
  to:
    kind: Service
    name: dashboarding

解决方案三:使用base64编码/解码stdout

保存格式的另一种选择是在存储/传输数据时对其进行编码,然后在访问/接收数据时对其进行解码:

$: MYVARVALUE=some-new-domain
$: template=$(cat "file.yaml" | sed "s/domain/$MYVARVALUE/g" | base64 -w 0)
$: echo "$template" | base64 -d

这也给出了以下stdout

apiVersion: route.openshift.io/v1
kind: Route
metadata:
  name: dashboarding-route
spec:
  host: dashboarding-route.some-new-domain
  port:
    targetPort: 100
  tls:
    termination: passthrough
  to:
    kind: Service
    name: dashboarding

最后一种解决方案对于在机器之间移动格式敏感的数据(如ssh键或散列值)特别有用;请注意,这不是加密的替代品!

相关问题