Zenity
zenity 不顯示所有帶有變數的列表
我正在為 Ubuntu 搜尋並安裝 PPA 腳本。這個帶有zenity的腳本工作80%,問題是這個腳本搜尋時;只顯示第一行。我需要所有線路
#!/bin/sh # simple search and install PPA # by David Vásquez if [ $# -gt 0 ] ; then echo "$*" else echo "No input" exit fi code=$* cat /dev/null > /tmp/ppa cat /dev/null > /tmp/ppa-url-tmp mojito=$(curl https://launchpad.net/ubuntu/+ppas?name_filter=$code | grep -e '+archive/' | grep "$code" | awk -F'<td><a href="/~' '{print $2}' | awk -F'">' '{print $1}' | uniq | tr -d '~') echo $mojito | tr ' ' '\n' | tee -a /tmp/ppa-url-tmp file="/tmp/ppa-url-tmp" while IFS= read -r line; do # display $line or do somthing with $line title=$(curl https://launchpad.net/~$line | grep -e '<title>' | awk -F '<title>' '{print $2}' | awk -F '</title>' '{print $1}' | sed 's/^/"/' | sed 's/$/"/') description=$(curl https://launchpad.net/~$line | grep -e 'content=' | awk -F 'content="' '{print $2}' | awk -F '.' '{print $1}' | tr -d '/>' | tr -d '"' | sed -e :a -e N -e 's/\n/ /' -e ta | sed 's/^/"/' | sed 's/$/"/') support=$(curl https://launchpad.net/~$line | grep -e '<option value=' | grep [0-9] | awk -F '(' '{print $2}' | awk -F ')' '{print $1}' | sed -e :a -e N -e 's/\n/ /' -e ta | awk '{print $1, $2, $3}' | sed 's/^/"/' | sed 's/$/"/' ) echo $title $description $support $line | uniq -u | tee -a /tmp/ppa zenity --list --radiolist --title="Package installation." --text="Select package to be installed" --width=800 --height=500 --column=In --column=Name --column=Description --column=Compatible --column=PPA "in" "$title" "$description" "$support" "$line" if [[ "$?" != 0 ]]; then exit else CHECK_INST=$(echo $CHECK | awk -F'|' '{print $5}') sudo apt-add-repository $CHECK_INST sudo apt-get -y update sudo apt-get install $code fi done <"$file"
我在這裡的其他嘗試(相同的結果)
從終端一個例子
myscript pipelight
從您的描述和程式碼中,聽起來您正在尋找這樣的東西:
要獲得像這樣構造的對話框,您的原始腳本需要以幾種關鍵方式進行擴充。對於初學者,您需要移動呼叫以建構
zenity
對話框,以便它在while
收集有關各種 PPA 的所有數據的循環之外。缺少的另一件事是儲存有關您正在收集的 PPA 的所有位的資料結構。為此,Bash 數組為這些數據提供了完美的“容器”。
lines=("${lines[@]}" "FALSE" "$title" "$description" "$support" "$line")
這將繼續將您通過 while 循環收集的結果附加到名為
lines
. 然後將該數組提供給zenity
,它包含列數據。完整的腳本
這是整個事情的總和,產生了上面的對話框截圖。
#!/bin/bash file="ppa-url-tmp" lines=() while IFS= read -r line; do # display $line or do somthing with $line title=$(curl https://launchpad.net/~$line | grep -e '<title>' | awk -F '<title>' '{print $2}' | \ awk -F '</title>' '{print $1}' | sed 's/^/"/' | sed 's/$/"/') description=$(curl https://launchpad.net/~$line | grep -e 'content=' | awk -F 'content="' '{print $2}' | \ awk -F '.' '{print $1}' | tr -d '/>' | tr -d '"' | sed -e :a -e N -e 's/\n/ /' -e ta | sed 's/^/"/' | sed 's/$/"/') support=$(curl https://launchpad.net/~$line | grep -e '<option value=' | grep [0-9] | awk -F '(' '{print $2}' | \ awk -F ')' '{print $1}' | sed -e :a -e N -e 's/\n/ /' -e ta | awk '{print $1, $2, $3}' | sed 's/^/"/' | sed 's/$/"/' ) echo $title $description $support $line | uniq -u | tee -a /tmp/ppa lines=("${lines[@]}" "FALSE" "$title" "$description" "$support" "$line") done <"$file" zenity --list --radiolist --title="Package installation." --text="Select package to be installed" \ --width=800 --height=500 --column=In --column=Name --column=Description --column=Compatible --column=PPA "${lines[@]}" if [[ "$?" != 0 ]]; then exit else CHECK_INST=$(echo $CHECK | awk -F'|' '{print $5}') sudo apt-add-repository $CHECK_INST sudo apt-get -y update sudo apt-get install $code fi
附加調試提示
當您不清楚 Bash 腳本中正在做什麼時,請使用命令
set -x
和set +x
. 這些將啟用和禁用 Bash 的冗長,這可以真正幫助闡明正在發生的事情。這是我的zenity
命令,只是冗長地出現了:set -x zenity --list --radiolist --title="Package installation." --text="Select package to be installed" \ --width=800 --height=500 --column=In --column=Name --column=Description --column=Compatible --column=PPA "${lines[@]}" set +x
這是我跑步時的樣子
./myscript ...
:+ zenity --list --radiolist '--title=Package installation.' '--text=Select package to be installed' --width=800 --height=500 --column=In --column=Name --column=Description --column=Compatible --column=PPA FALSE '"pipelight-daily : Michael Müller"' '"This PPA provides daily builds of the Pipelight project pipelight-daily "' '"14.04 13.10 13.04"' mqchael/+archive/pipelight-daily FALSE '"Pipelight : Michael Müller"' '"Pipelight allows one to run Silverlight inside a Linux browser using Wine Pipelight "' '"14.04 13.10 13.04"' mqchael/+archive/pipelight FALSE '"pipelight-experimental : “Pipelight Dev Team” team"' '"Experimental packages for Pipelight pipelight-experimental "' '"14.04 13.10 13.04"' pipelight/+archive/experimental FALSE '"pipelight-daily : “Pipelight Dev Team” team"' '"pipelight-daily "' '"14.10 14.04 13.10"' pipelight/+archive/daily FALSE '"pipelight-stable : “Pipelight Dev Team” team"' '"pipelight-stable "' '"14.10 14.04 13.10"' pipelight/+archive/stable FALSE '"libva : “Pipelight Dev Team” team"' '"libva "' '"13.10 12.10 12.04"' pipelight/+archive/libva + set +x
以上揭示了所有列組件如何通過使用
"${lines[@]}"
.