shell 创建时的Echo/Printf环境键/值

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

我使用bash 4,并设置了几个变量(每个变量都以MIH_开头),类似于:

: "${MIH_POD_NAME:=$(kubectl get pods --namespace mih -l "app.kubernetes.io/name=mih,app.kubernetes.io/instance=mih" -o jsonpath="{.items[0].metadata.name}")}"

我想知道是否有可能在创建这些环境变量时将其详细信息打印到stdout内联,而不是必须创建它们,然后分别在它们上面打印,使用:

for var in "${!MIH_@}"; do
   logger $(printf '%s=%s\n' "$var" "${!var}")
done

输出量:

INFO  MIH_POD_NAME=mih-8695f87c8c-t5klb

(Note,logger是我写的一个函数,它接受一个字符串并将其格式化为一个漂亮的输出。
:之前添加echo只会打印冒号之后的值:: mih-8695f87c8c-t5klb
我设法做到这一点,通过添加:

; eval "logger $(printf '%s=%s\n' MIH_POD_NAME $MIH_POD_NAME)"

每个命令的结尾。但我想知道是否有一种更有活力的方式来实现这一目标?

0tdrvxhp

0tdrvxhp1#

您可以使用**declare**来实现您的目的。
我们可以使用关联数组选项(-A)将变量名存储为键,将相应的命令存储为值。例如:

declare -A MIH_VARS=(
  ["MIH_POD_NAME"]="kubectl get pods --namespace mih -l 'app.kubernetes.io/name=mih,app.kubernetes.io/instance=mih' -o jsonpath='{.items[0].metadata.name}'"
  ["MIH_VAR_1"]="echo '8080'"
  ["MIH_VAR_2"]="cmd_to_get_other_port_no"
)

for var in "${!MIH_VARS[@]}"; do
  declare -g "${var}=$(${MIH_VARS[$var]})"
  logger "$(declare -p ${var})"
done

DEMO

相关问题