作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我正在尝试做的一个精简的例子。
#!/usr/bin/env bash
set -x
echo "$@"
调用它
bash script -vv --foo='bar baz'
产量
+ echo -vv 'foo=bar baz'
-vv foo=bar baz
请注意,+ 行(即调试行)在整个 foo=bar baz 周围放置了单引号。我需要它通过
foo='bar baz'
不是
'foo=bar baz'
我尝试了几次迭代都无济于事。
最佳答案
set -x
不会更改参数中的引号:foo='bar baz'
和 'foo=bar baz'
是写同一个字符串的两种不同方式。您传递这些参数的任何程序都将被赋予 C 字符串 "foo=bar baz"
(那些双引号是 C 语法,不是文字内容)在其 argv 数组中的相关位置。请注意,没有 '
s 在该字符串中的任何位置。
这是真的,因为所有 POSIX shell(一个 bash 是其中的成员的类)都在每个字符的基础上评估引用;和语法引号在实际执行之前被删除,因此只留下文字数据。
在 foo='bar baz'
, 你有 foo=
在未引用的上下文中和 bar baz
在单引号上下文中连接在一起成为一个字符串。
在 'foo=bar baz'
,shell 的调试输出显示一个包含该操作结果的字符串。
这些字符串是相同的;它们只是碰巧使用不同的语法进行描述。因此,这两种表示之间的区别不可能导致任何错误,因为它们导致传递给被调用程序的值完全相同; 被调用的程序无法分辨使用了哪个,因此无法根据区别改变其行为。因此,基于这种区别的错误是不可能的。
关于bash - 如何将 foo ='bar baz' 传递给来自 cli 参数的命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64065544/
我是一名优秀的程序员,十分优秀!