Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何让空参数在命令替换中继续存在?_Bash_Quoting - Fatal编程技术网

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

Bash 如何让空参数在命令替换中继续存在?,bash,quoting,Bash,Quoting,我想调用dialogla: 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/\$/ ''/;" 但是: 其输出: A '' B '' C '' 显示命令替换的结果只是单词分割,但是'不会被解释为空参数,而是被详细地传递给echo(因

我想调用
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/\$/ ''/;"
但是:

其输出:

A '' B '' C ''
显示命令替换的结果只是单词分割,但是
'
不会被解释为空参数,而是被详细地传递给
echo
(因此,
对话框
不会显示菜单项的任何描述,而是字面上的
'

我可以在bash中使用数组来解决这个问题,但是有没有一个更简单的解决方案我没有

给定

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

您可以尝试以下操作:

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}"

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

似乎有效。好吗?我不知道,但我会尝试一下阵列魔法。顺便说一下,您可以经常使用
${parameter/pattern/string}
代替调用
sed
。不幸的是,它只对一个变量进行操作,这使得它的可用性降低。

问得好

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

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
它很容易扩展以处理表单
标记的输入行


您试图解决的实际问题是什么?@AnsgarWiechers给定
{echo A;echo B;echo C;}
,我想执行
对话框--菜单选择:0 40 10 A''B''C''
。为什么要运行该对话框?你想通过这样做实现什么?他的问题是,他想使用
$(echo“”)
,将一个空字符串传递给
对话框
,但即使
$(echo“”)
“返回”
''
,它是字符串
'
,而不是空字符串。@Tim我对你的问题进行了澄清更新。如果您不喜欢,请还原我的更改。如果我不需要
sed
,我就不会有问题:-)。问题是
A
B
C
来自动态查询。是的,但是您可以使用命令替换轻松地将
A
B
C
写入
arg
字符串。为我工作,谢谢。然而,要调用
dialog
,我必须在一个单独的命令中设置
IFS
IFS=,dialog
不起作用)。我的结果是:
SAVEIFS=“$IFS”;如果S=,;如果!对话框--菜单“选择要装入的快照”0 40 10$(sort.snaplist | sed-e's/$/,/;'| tr-d\\n);然后[…]
cmd="dialog --menu Choose: 0 40 10 "
arg="`echo A \'\' B \'\' C \'\'`"
eval "${cmd}${arg}"
$ IFS=, 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
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