首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扩展变量作为另一个命令的参数,通过Bash中的连接

扩展变量作为另一个命令的参数,通过Bash中的连接
EN

Stack Overflow用户
提问于 2021-03-02 17:02:37
回答 1查看 35关注 0票数 0

假设我想使用另一个变量some-command中存储的参数通过$()调用某个命令argument,后者包含空间。

  1. 根据我目前的理解,result="$(some-command $argument)" (例如扩展)导致传递两个参数的事实与我所期望的一样。

  1. Question部件:为什么result="$(some-command "$argument")" (例如级联)导致传递一个参数的预期结果?

更多详细信息:

./some-command

代码语言:javascript
复制
#!/usr/bin/env bash
echo "Arg 1: $1"
echo "Arg 2: $2"

./test-script

代码语言:javascript
复制
#!/usr/bin/env bash

export PATH="`pwd -P`:$PATH"

argument="one two"

echo "Calling with expansion"
res="$(some-command $argument)"
echo $res

echo "Calling with concatenation"
res="$(some-command "$argument")"
echo $res

调用test-script将导致以下输出:

代码语言:javascript
复制
Calling with expansion
Arg 1: one Arg 2: two
Calling with concatenation
Arg 1: one two Arg 2:

我似乎不了解smth何时展开/评估,以及展开变量是如何分组为传递给脚本的参数的。

谢谢!

额外的好奇心是为什么result="$(some-command \"$argument\")"根本不起作用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-02 17:18:29

在bash中,引用和扩展就是这样工作的。实际上,不需要在=之后使用双引号,因为不执行分字操作,所以

代码语言:javascript
复制
result=$(some-command "$argument")

应该以同样的方式工作。

没有“连接”发生。Bash将$()中的字符串视为一个命令,并在运行它之前运行它上的所有扩展。

那么,some-command "$argument"会发生什么呢?首先,参数展开将$argument扩展为包含空格的字符串。当分字发生时,它注意到字符串是用双引号括起来的,所以它把它保持为一个字符串。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66443833

复制
相关文章

相似问题

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