作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 shell 脚本(我们称之为product.sh
),它以以下形式输出数据,但不将其保存到文件中:
FOO=value
BAR=value2
ZAP=value3
我想在 shell 脚本中使用这些值作为环境变量。我目前正在使用以下 shell 代码执行此操作:
export $(./produce.sh)
这非常有效,除非 =
右侧的值包含空格。例如:
FOO=split value
我在product.sh
中尝试了两种不同的方法:
FOO="split value"
)FOO=split\value
)这两个都不起作用:如果我检查环境变量,FOO
在第一个示例中包含 "split
,在第一个示例中包含 split\
第二个。
如何让 export
正确处理此问题?
最佳答案
zsh 中的 f
参数扩展标志将在换行符上分割输入,因此这应该处理带有空格的输入值:
export ${(f)"$(./produce.sh)"}
product.sh 的输出:
=
分隔。替换的部分:
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/
我是一名优秀的程序员,十分优秀!