设想:
kdialog --menu
接受形式为 的字符串列表title element label element label ...
。现在,这个问题是空格被用作分隔符。
假设我有一个字符串变量 $LIST ,其中包含由另一个命令生成的文件路径和标签列表。我想让 kdialog 使用该变量中的元素。以下是可以在变量内格式化列表的三种方式:
file A /dir/file A file B /dir/file B file C /dir/file C
显然这是没有用的,因为文件名中的空格和分隔空格之间没有区别。
"file A" "/dir/file A" "file B" "/dir/file B" "file C" "/dir/file C"
如果我尝试使用kdialog --menu title $LIST
它不起作用,因为 kidalog 只是忽略引号。如果我使用${LIST}
or `echo $LIST`
,也是如此$(echo $LIST)
。它实际显示在生成的菜单中的标签列表将始终是
A"
A"
B"
B"
C"
C"
"$LIST"
另一方面,使用会产生错误。
file\ A /dir/file\ A file\ B /dir/file\ B file\ C /dir/file\ C
这样做的效果与引号的情况完全相似,除了在这种情况下,我可以使用 "$LIST" 来产生同样无用的结果而不会出错。
问题:
如何将带有字符串元素列表的变量(每个元素可能包含也可能不包含空格)传递给命令,以便命令将每个元素解释为单独的参数,但带有转义空格?
您需要一些东西来解析单个字符串并从中创建多个参数。这正是
xargs
. 像这样:或者
请注意,我使用了您尝试过的确切字符串。每个字符串都恰好是
xargs
您所期望的解析格式。请参阅man 1 xargs
以了解详细信息。您的问题被标记为bash。在不需要的 Bash 中
printf
,可以使用以下语法:注意:避免使用大写的变量名。如果您习惯了它们,那么迟早您可能会更改
PATH
某些脚本中的另一个重要环境变量,并且脚本的其余部分将失败。