当前位置: 首页 > 知识库问答 >
问题:

Zsh导出忽略引号和反斜杠

归俊杰
2023-03-14

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

FOO=value
BAR=value2
ZAP=value3

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

export $(./produce.sh)

这非常有用,除非< code>=右边的值包含空格。例如:

FOO=split value

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

    < li >用引号将值括起来(< code > FOO = " split value " ) < li >用反斜线转义空格(< code > FOO = split \ value )

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

如何使导出正确处理此问题?

共有2个答案

嵇丰
2023-03-14
FOO=split value

不会将变量设置为包含空格的值。它临时将< code>FOO设置为split,并在设置了< code>FOO的环境中运行命令< code>value。总体效果类似于

(export FOO=split; value)

你可以通过做一个

FOO=split printenv

它将运行< code>printenv并在其输出中显示< code>FOO的值。

要将变量设置为包含空格的值,需要对空格进行转义,例如

FOO=split\ value

或使用引号。

要处理此文件,您可以使用 eval

eval export $(./produce.sh)

当然,只有当你完全控制 produce.sh 写入 stdout 的内容(即不要让任何受污染的数据潜入)时,你才应该这样做,因为 eval 是一个潜在的安全漏洞。

或者,您可以修改produce.sh以在每一行前面已经生成export前缀,然后只执行

eval $(./produce.sh)
拓拔俊艾
2023-03-14

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

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

produce.sh的输出:

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

替换的部分:

  • <code>生成。sh</code>:生成键值输出,例如:<code>N=V1\nP=V2\N</code>
  • $(…):命令替换。它被替换为输出,减去尾随换行符:N=V1\nP=V2
  • “…”:引号确保在下一步中将先前的结果作为单个术语处理
  • ${(f)…}:将单个项扩展为多个标量值,由于(f)标志而在换行符上拆分。结果是有效的<code>‘N=V1’‘P=V2’</code>
  • export:分配和导出每个参数,就像export‘N=V1’‘P=V2’

下面的替换添加了一些其他神秘的zsh ism来创建一个关联数组。这避免了向使用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

一个小的折衷——如果该值包含一个等号,例如< code>D=D=D,这将不起作用。

 类似资料:
  • 我有一个10万个csv数据,其中包含名称,我使用了编码,我发现它可以很好地用于特殊的单词字符,如等。当一些名称具有(单反斜杠)并且UTF-8刚刚删除它时,问题就出现了,但我需要: 告诉utf-8忽略单个反斜杠 我有的一些代码: 我不能使用,因为有些名称可以包含单个反斜杠和特殊的单词字符。如何用编码实现字节数组的反斜杠无知?

  • 我有一个10万个csv数据,其中包含名称,我使用了编码,我发现它可以很好地用于特殊的单词字符,如等。当一些名称具有(单反斜杠)并且UTF-8刚刚删除它时,问题就出现了,但我需要: 告诉utf-8忽略单反斜杠? 使用utf-8编码,忽略反斜线? 我有的一些代码: 我不能使用,因为有些名称可以包含单个反斜杠和特殊的单词字符。如何用编码实现字节数组的反斜杠无知?

  • 我写了一个小函数,将Windows路径“转换”为OSX路径,并在Finder中打开它。该函数与bash完美配合,但与zsh(我使用的是oh-my-zsh)不配合。 问题是,它会解析特定的反斜杠组合,例如:、、、

  • 我使用的是spring 4.0.1,hibernate 4.3.5,jackson 1.9.2和STS IDE我正在创建一个RESTful Web服务,当我使用Hibernate代码生成器时,它以JSON格式返回数据,它生成由注释的关联实体的getter和setter,用于源,用于引用,这会导致无限递归序列化。我尝试使用Jackson的@JsonIgnore和@JsonBackReference注

  • 问题内容: 如何在Python中转义反斜杠和单引号或双引号? 例如: 问题答案: 你是怎么做到的 如果您从文件中读取了“长字符串”(如您在注释中所述),那么您的问题将引起误解。由于您显然不完全了解转义的工作原理,因此您写下的问题可能与您真正遇到的问题不同。 如果这些是文件的内容(如图所示为51个字节+可能是一两个行尾字符): 那么这就是在python中的样子: 您在问题中写的内容将产生: 你看得到

  • 问题内容: 我似乎有问题。我有一个查询字符串,其值可以包含单引号。这将中断查询字符串。因此,我试图进行替换以更改为。 这是一个示例代码: 输出仍然是: 它认为我只是对引号进行转义。 所以我尝试了这两段代码: 上面的两个STILL结果都相同: 我似乎只能得到这实际上吐出一个斜线: 结果是: 有什么建议?我只是想更换一个同。 似乎应该没有那么困难。 问题答案: 首先,如果您要对查询字符串编码撇号,则需