我想像这样调用dialog
:
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: ['']
如何更改 $(...)
部分,使项目为 []
而不是 ['']
.
最佳答案
好问题。
我不知道这是否符合“更简单”的条件,但它有一定的优雅:
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/