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

Dan*_*der 6 shell bash dash environment-variables

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

myvariable="line 1

LINE=3
some characters: # \" \$
line 5"
myvariable2="abc"
export myvariable myvariable2
Run Code Online (Sandbox Code Playgroud)

预期结果(可用脚本):

declare -x myvariable="line 1

LINE=3
some characters: # \" \$
line 5"
declare -x myvariable2="abc"
Run Code Online (Sandbox Code Playgroud)

结果就是我使用export命令得到的结果。但它导出所有 envvars 并且不允许过滤。由于变量的多行字符,grep结果是不可能的。

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

Sté*_*las 2

zshyash.

export -p myvariable myvariable2
Run Code Online (Sandbox Code Playgroud)

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

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

for var in myvariable myvariable2; do
  printf 'export %s=%q\n' "$var" "${!var}"
done
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

 (PS4=; set -x; export "myvariable=$myvariable") 2>&1
Run Code Online (Sandbox Code Playgroud)