来自变量的 Zenity 列表对话框

来自变量的 Zenity 列表对话框

我有一个如下所示的 bash 脚本:

column_names="--column=\"TargetDir\" --column=\"TargetPage_ID\" --column=\"TargetTitle\""
row="\"Target Dir 1\" 1 \"TargetTitle 1\""

echo "column_name is: [$column_names]"
echo "row is: [$row]"

zenity --list --title="list" $column_names $row

但是当我运行它时,我看到一个奇怪的对话框:

在此处输入图片描述

您可以看到显示了两行,而不是一行(每个单词都未识别为列的值)。这也是终端中的输出:

column_name is: [--column="TargetDir" --column="TargetPage_ID" --column="TargetTitle"]
row is: ["Target Dir 1" 1 "TargetTitle 1"]

但是当我以这种方式复制终端中的column_name和的打印值时:row

zenity --list --title="list" --column="TargetDir" --column="TargetPage_ID" --column="TargetTitle" "Target Dir 1" 1 "TargetTitle 1"

我得到一个真正的列表对话框:

在此处输入图片描述

脚本中有什么错误?

答案1

当你构建命令行时,总是使用数组。它可以省去引用的很多麻烦:

column_names=(--column=TargetDir --column=TargetPage_ID --column=TargetTitle)
row=("Target Dir 1" 1 "TargetTitle 1")

请注意,现在只剩下必要的引号(用于保护空格)。

当使用数组时a"${a[@]}"将按原样扩展元素,而不会导致空格问题。所以:

zenity --list --title="list" "${column_names[@]}" "${row[@]}"

尝试运行printf而不是echo使用原始变量,您可能会看到出现的问题:

printf "%s\n" $column_names $row

我甚至不想尝试解释原始引用中出现了什么问题。:shudder:

相关内容