我有一个如下所示的 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: