首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么在使用bash $()语法时保留引号,而不是手动执行?

为什么在使用bash $()语法时保留引号,而不是手动执行?
EN

Stack Overflow用户
提问于 2022-01-18 11:51:50
回答 2查看 57关注 0票数 1

我有以下bash脚本:

代码语言:javascript
复制
$ echo $(dotnet run --project Updater)
UPDATE_NEEDED='0' MD5_SUM="7e3ad68397421276a205ac5810063e0a"

$ export UPDATE_NEEDED='0' MD5_SUM="7e3ad68397421276a205ac5810063e0a"

$ echo $UPDATE_NEEDED
0

$ export $(dotnet run --project Updater)

$ echo $UPDATE_NEEDED
'0'

为什么$UPDATE_NEEDED在第三个命令中是0,而在第五个命令中是'0'

我需要做什么才能使它简单地设置为0?相反,使用UPDATE_NEEDED=0并不是一种选择,因为其他一些变量可能包含一个空格(我想乐观地引用它们,以便让它正确地解析空间)。

而且,这是一个有点XY问题。如果有人知道从可执行文件导出多个变量的更简单的方法,然后在bash脚本中使用,那么这也是有用的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-01-18 13:36:31

关于Glenn的回答,我想说的是:

  1. 当您用Bash代码编写类似于export UPDATE_NEEDED='0'的内容时,这与export UPDATE_NEEDED=0是100%相同的。Bash使用引号来解析命令表达式,但它们随后会被立即丢弃。它们的唯一目的是防止分词,避免不得不转义特殊字符。同样,就Bash而言,代码片段'foo bar'foo\ bar完全相同:两者都导致空间被视为文字而不是单词拆分器。
  2. 相反,参数展开和命令替换遵循不同的规则,并保留文字引号。
  3. 当使用eval时,传递给eval的命令行参数被视为Bash代码,因此遵循与常规Bash代码相同的展开规则,这将导致与(1)相同的结果。
票数 2
EN

Stack Overflow用户

发布于 2022-01-18 13:25:24

显然,Updater项目所做的工作相当于

代码语言:javascript
复制
echo "UPDATE_NEEDED=\'0\' MD5_SUM=\"7e3ad68397421276a205ac5810063e0a\""

它明确地输出了引号。

当您执行export UPDATE_NEEDED='0' MD5_SUM="7e3ad68397421276a205ac5810063e0a"时,bash最终会在实际设置变量之前进行删除引号

我同意@pynexj,eval在这里是有理由的,尽管建议增加引用:

代码语言:javascript
复制
eval export "$(dotnet ...)"
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70755172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档