bash - 如何让空参数在命令替换中继续存在?

标签 bash quoting

我想像这样调用dialog:

dialog --menu Choose: 0 40 10 A '' B '' C ''

除了ABC是动态查询的结果,为了这个问题后者是 { echo A; echo B; echo C;

我似乎可以通过以下方式获得所需的命令行:

{ echo A; echo B; echo C; } | sed -e "s/\$/ ''/;"

但是:

echo $({ echo A; echo B; echo C; } | sed -e "s/\$/ ''/;")

及其输出:

A '' B '' C ''

显示命令替换的结果只是分词,但是 '' 没有被解释为空参数,而是详细地传递给 echo(并且因此,dialog 不会显示菜单项的任何描述,而是字面上的 ''s)。

我可以在 bash 中使用数组来解决这个问题,但是我缺少更简单的解决方案吗?

给定

$ e() { printf "tag: [$1] item: [$2]"; }
$ e $(echo "A ''")
$ tag: [A] item: ['']

如何更改 $(...) 部分,使项目为 [] 而不是 [''] .

最佳答案

好问题。

我不知道这是否符合“更简单”的条件,但它有一定的优雅:

with-tags() {
  local line
  if read -r line; then with-tags "$@" "$line" ""; else "$@"; fi
}

{ echo A; echo B; echo C; } |
with-tags dialog --menu Choose: 0 40 10

它很容易扩展以处理 TAG <optional description> 形式的输入行:

with-tag-lines() {
  local tag desc
  if read -r tag desc; then with-tag-lines "$@" "$tag" "$desc"; else "$@"; fi
}

{ echo A with optional description; echo B; echo C; } |
with-tag-lines dialog --menu Choose: 0 40 10

关于bash - 如何让空参数在命令替换中继续存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18046386/

相关文章:

shell - 在 sed/shell 中转义 < 和 >

linux -/usr/bin/找到 : Argument list too long in for loop bash script

shell - 我如何让 Tcl 的 exec 运行一个命令,该命令的参数包含带空格的引号字符串?

bash - 使用 eval 运行管道命令

Bash:在新终端中执行带有参数的命令

bash - 如何屏蔽kill输出

php - 将 bash 换行符转换为 HTML 换行符;在 BASH 中运行良好,但不能通过 shell_exec

linux - 如何计算远程 git 存储库的总行数

linux - Bash Script_将从读取命令读取的变量插入命令

bash - ECS/Fargate 容器定义命令参数