如何让空参数在命令替换中存活?

时间:2013-08-04 18:50:30

标签: bash quoting

我想致电dialogàla:

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: ['']

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

3 个答案:

答案 0 :(得分:2)

好问题。

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

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

答案 1 :(得分:1)

您可以更改IFS(内部字段分隔符)

$ IFS=, e $(echo "a,,")
tag: [a] item: []

似乎工作。是不是不错?我不知道但是会尝试一些阵列魔法。顺便说一句,您通常可以使用${parameter/pattern/string}进行替换,而不是调用sed。不幸的是,它只对变量进行操作,这使得它的可用性降低。

答案 2 :(得分:0)

你可以试试这个:

cmd="dialog --menu Choose: 0 40 10 "
arg="`echo $({ echo A; echo B; echo C; } | sed -e "s/\$/ ''/;")`"
eval "${cmd}${arg}"

但我认为这里不需要sed。你可以保持简单:

cmd="dialog --menu Choose: 0 40 10 "
arg="`echo A \'\' B \'\' C \'\'`"
eval "${cmd}${arg}"