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
答え1
説明とコードを見ると、次のようなものを探しているようです。
このように作成されたダイアログボックスを取得するには、元のスクリプトをいくつかの主要な方法で拡張する必要があります。まず、さまざまなPPAのすべてのデータを収集するループの外になるように、zenity
呼び出しをビルドダイアログボックスに移動する必要があります。while
別の欠落点は、収集中の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[@]}"
。