我想致电dialog
àla:
dialog --menu Choose: 0 40 10 A '' B '' C ''
除了A
,B
和C
是动态查询的结果,为了这个问题,后者是{ 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: ['']
如何更改$(...)
部分,以使该项目为[]
而不是['']
。
答案 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}"