bash - 如何转义嵌套 bash 命令返回的空格

标签 bash escaping

标题有点令人困惑,因为问题本身很令人困惑。

先决条件:

我使用此脚本 script.sh 作为传递参数的 Playground :

#!/bin/bash

echo $1
echo $2
echo $3

问题:

我期待这个电话

./script.sh $( echo "foo \"bar baz\"" )

表现得完全一样

./script.sh foo "bar baz"

相应地,我期望得到

foo
bar baz

作为输出结果但返回

foo
"bar
baz"

显然,我需要逃避一些事情。我怀疑这是一个空格,但我不确定。

问题:嵌套的 echo 调用应该是什么样子,以便外部调用接收 2 个参数

PS:这是一个更复杂的脚本的简化,但保留了原始调用的主要问题。

最佳答案

你不能这样做。无论什么 $(somecommand) 都将被视为数据,而不是解释为 shell 语法,因此其中的任何引号和转义符都将被视为常规字符。这就是您所看到的 - echo 打印的双引号被视为 ./script.sh 参数的一部分,而不是分隔符 < em>围绕参数。

另一种思考方式是根据 shell 解析命令行时所经历的过程。以下是高度简化的摘要:

  1. 解析命令行,包括引号和转义符。请注意,引号和转义符在此过程中被删除。
  2. 扩展变量 ($var) 和命令替换($( ) 和反引号命令)等内容。
  3. 对这些扩展的结果执行分词和通配符扩展(除非它们在步骤 1 中使用双引号)。

请注意,当任何变量扩展或命令替换的结果成为命令行的一部分时,引号和转义解析已经完成; shell 根本不会将该处理应用于这些扩展的结果。

现在,根据您实际想要做什么,可能有另一种方法来完成它。例如,有多种方法可以使用readxargs来分割字符串,同时尊重其中的引号/转义符。还有eval,但如果可能的话请避免使用——它作为 bug 磁石而享有当之无愧的声誉。

关于bash - 如何转义嵌套 bash 命令返回的空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45580005/

相关文章:

bash - 运行 cronjob 时权限被拒绝

linux - awk根据条件过滤文件

sql - 在查询中使用 where IN 子句的参数不匹配

asp.net - 如何避免 System.Xml.Linq.XElement 转义 HTML 内容?

bash - 转义参数中的冒号、等于、& 符号

Bash 函数从 POSIX PATH 中删除重复项

bash - 在 bash 中将波形符扩展与变量替换相结合

php - 关于查找文本的 mysQL 查询帮助

string - 我无法正确逃避什么?

bash - 在 bash 中进行 float 学运算时为 "Invalid Arithmetic Operator"