特定のフォルダーにある一連のスクリプトの1つを呼び出すZenityインターフェイスを構築しようとしています。このために、私はzenity --list
に依存しています。リストには2つの列が必要です。1)スクリプトファイル名と2)説明テキスト[スクリプトファイル自体の中の3番目の行のコメントから]。
問題なく、ファイル名のみのインターフェイスの単一列を作成できます。ここで問題が発生するのは、説明のために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"
もっと簡単に言うと、次の2つのコマンドセットが端末から同様の結果を提供しない理由を理解したいと思います。
$ 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
引用符で囲まれた文字列内の引用は、フィールド分割を行うシェルにとって重要ではありません。他のキャラクターと同じです。そのため、$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
私はあなたが使用できる私の学校のプロジェクトにこのコードを使用します
#!/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"