我正在尝试构建一个 zenity 接口,调用位于特定文件夹中的一组脚本之一。为此,我依靠zenity --list
。我希望列表有两列:1) 脚本文件名和 2) 描述文本 [来自第三行的注释,在脚本文件本身内]。
我可以为仅显示文件名的界面创建单列,没有任何问题。当我想使用第二列进行描述时,问题就出现了,我试图模仿以下示例:
zenity --list \
--title="Choisissez les bogues à afficher" \
--column="N° de bogue" --column="Gravité" --column="Description" \
992383 Normal "GtkTreeView plante lors de sélections multiples" \
293823 Grave "Le dictionnaire GNOME ne prend pas de proxy en charge" \
393823 Critique "L'édition de menu ne fonctionne pas avec GNOME 2.0"
更简单地说,我想了解为什么从终端来看,以下两组命令不能提供类似的结果:
$ zenity --list --title="Choose script" --column="Script" --column="Description" a.sh "chaise longue" b.sh "moineau"
和
$ TESTSTRING='a.sh "chaise longue" b.sh "moineau"'
$ echo $TESTSTRING
a.sh "chaise longue" b.sh "moineau"
$ zenity --list --title="Choose script" --column="Script" --column="Description" $TESTSTRING
答案1
带引号的字符串中的引号对于执行字段拆分的 shell 来说无关紧要。它们就像任何其他字符一样。因此,当您使用$TESTSTRING
而不是 时"$TESTSTRING"
,- 中的引号chaise longue
和moineau
-不要防止字段分裂:
$ TESTSTRING='a.sh "chaise longue" b.sh "moineau"'
$ printf "%s\n" $TESTSTRING
a.sh
"chaise
longue"
b.sh
"moineau"
如果您想保留所需的拆分,请使用数组:
$ TESTSTRING=(a.sh "chaise longue" b.sh "moineau")
$ printf "%s\n" "${TESTSTRING[@]}"
a.sh
chaise longue
b.sh
moineau
答案2
答案3
使用 MySql 的动态列表
我在学校的一个项目中使用了此代码,您可以使用它吗
#!/bin/bash
arg="-u user -pPass -D Database -s -e"
function lista(){
gerentes=$(mysql $arg "SELECT * FROM empleado;")
OIFS=$IFS;
IFS=$'\n';
array=($gerentes)
for ((i=0; i<${#array[@]}; ++i));
do
IFS=$'\t'
cont=(${array[$i]})
for ((j=0; j<${#cont[@]}; ++j));
do
echo -n -e "${cont[$j]}" | tr -d '[[:space:]]'
echo -n -e "\t"
done
IFS=$OIFS;
done
IFS=$OIFS;
}
首先,我定义一个函数“lista”,并在 zenity 代码中调用它
OP=$(zenity --list \
--title="Seleccione Gerente" \
--column="id" --column="Fecha" --column="Nombres" --column="cedula" --column="user" --column="cargo" --column="direccion" \
$(lista))
echo "Selecciono: $OP"