gpt4 book ai didi

shell - Zsh 导出忽略引号和反斜杠

转载 作者:行者123 更新时间:2023-12-02 02:11:02 25 4
gpt4 key购买 nike

我有一个 shell 脚本(我们称之为product.sh),它以以下形式输出数据,但不将其保存到文件中:

FOO=value
BAR=value2
ZAP=value3

我想在 shell 脚本中使用这些值作为环境变量。我目前正在使用以下 shell 代码执行此操作:

export $(./produce.sh)

这非常有效,除非 = 右侧的值包含空格。例如:

FOO=split value

我在product.sh中尝试了两种不同的方法:

  1. 将值括在引号中 (FOO="split value")
  2. 使用反斜杠转义空格 (FOO=split\value)

这两个都不起作用:如果我检查环境变量,FOO 在第一个示例中包含 "split ,在第一个示例中包含 split\第二个。

如何让 export 正确处理此问题?

最佳答案

zsh 中的 f 参数扩展标志将在换行符上分割输入,因此这应该处理带有空格的输入值:

export ${(f)"$(./produce.sh)"}

发生了什么

product.sh 的输出:

  • 键值对。
  • 每个 kv 对都位于自己的线路上。
  • 键与值之间通过 = 分隔。
  • 语法类似于 shell,但不完全是 shell 语法,因此,
  • 值中允许使用空格和 shell 特有的其他一些字符。

替换的部分:

  • product.sh :生成键值输出,例如:N=V1\nP=V 2\n
  • $(...) :命令替换。它被替换为输出,减去尾随换行符:N=V1\nP=V 2
  • "...":引号确保先前的结果被视为下一步的单个术语。
  • ${(f)...} :将该单个项扩展为多个标量值,由于 (f) 标志而在换行符上分割。结果实际上是'N=V1' 'P=V 2'
  • export:分配并导出每个参数,其作用类似于export 'N=V1' 'P=V 2'

另一种选择

下面的替换添加了一些其他神秘的 zsh-isms 来创建关联数组。这避免了向消费 shell 添加任意变量环境:

% ./s2.sh
A=A
B=
C=C C
% typeset -A vals=("${(@s:=:)${(f)"$(./s2.sh)"}}")
% print ${vals[A]}
A
% print ${vals[C]}
C C

一个小的权衡 - 如果值包含等于,例如,这将不起作用D=D=D

关于shell - Zsh 导出忽略引号和反斜杠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67756416/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com