将变量中的文件路径列表作为参数传递给命令

将变量中的文件路径列表作为参数传递给命令

设想:

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}`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”来产生同样无用的结果而不会出现错误。

问题:

我如何将一个包含字符串元素列表的变量(每个元素可能包含或不包含空格)传递给命令,以便每个元素都被命令解释为单独的参数,但带有转义空格?

答案1

您需要一些东西来解析单个字符串并从中创建多个参数。这正是 的工作xargs。像这样:

LIST='"file A" "/dir/file A" "file B" "/dir/file B" "file C" "/dir/file C"'
printf '%s\n' "$LIST" | xargs kdialog --menu title

或者

LIST='file\ A /dir/file\ A file\ B /dir/file\ B file\ C /dir/file\ C'
printf '%s\n' "$LIST" | xargs kdialog --menu title

注意我使用了您尝试过的确切字符串。每个字符串恰好都采用xargs您期望的格式进行解析。请参阅man 1 xargs以了解详细信息。

您的问题已加标签。在 Bash 中你不需要printf,你可以使用以下语法:

<<<"$LIST" xargs kdialog --menu title

笔记:避免使用大写变量名称。如果你习惯了它们,那么迟早你可能会改变PATH某些脚本中的另一个重要的环境变量,而脚本的其余部分将会失败。

相关内容