使用正确的转义导出选择的环境变量

使用正确的转义导出选择的环境变量

我想将在破折号脚本中设置的一些环境变量导出到文件中:

myvariable="line 1

LINE=3
some characters: # \" \$
line 5"
myvariable2="abc"
export myvariable myvariable2

预期结果(可用的脚本):

declare -x myvariable="line 1

LINE=3
some characters: # \" \$
line 5"
declare -x myvariable2="abc"

结果就是我使用该export命令得到的结果。但它会导出所有环境变量并且不允许过滤。由于变量的多行字符,grep无法计算结果。

相比之下,该printenv命令允许仅输出变量的选择,但它不关心转义,并且在此用例中它不会输出变量名称。

答案1

zshyash.

export -p myvariable myvariable2

会如你所期望的那样工作。

否则,在 中bash,您仍然可以执行以下操作:

for var in myvariable myvariable2; do
  printf 'export %s=%q\n' "$var" "${!var}"
done

POSIXly,您可以使用以下命令手动进行引用awk

awk -v q="'" '
  function escape(v) {
    gsub(q, q "\\" q q, v)
    return q v q
  }
  BEGIN {
    for (i = 1; i < ARGC; i++)
      print "export " ARGV[i] "=" escape(ENVIRON[ARGV[i]])
  }' myvariable myvariable2

为了好玩,一个在某些 shell 中工作的 hacky 解决方案(bashzshmkshksh93、 notyashdash):

 (PS4=; set -x; export "myvariable=$myvariable") 2>&1

相关内容