ファイルを使用して複数のAPTパッケージをインストールしたいのですが。
apt_install_from_file "packages" # assumes 'packages' is a readable file in the $PWD
注:これを行うには他の方法があることを理解しており、話すための車輪の再発明を行っていますが、この方法で他の人の生活が楽になることを願っています。
packages
:
# ppa
ppa "deadsnakes/ppa"
# packages
apt "tree"
# deb
deb "fzy" [args: "https://github.com/jhawthorn/fzy/releases/download/0.9/fzy_0.9-1_amd64.deb", "$HOME", "fzy_0.9-1_amd64.deb"]
#
コメントであるため、で始まる行は無視してくださいppa
、引用符で囲まれたテキストを使用して次のコマンドを実行します。例ppa "deadsnakes/ppa"
=>sudo add-apt-repository -y ppa:deadsnakes/ppa &> /dev/null
apt
、引用符で囲まれたテキストを使用して次のコマンドを実行します。例apt "tree"
=>sudo apt install --allow-unauthenticated -qqy tree
deb
引用符で囲まれたテキストとargs
、引用符で囲まれた後続のテキストを取得します。apt_install_from_file() {
declare -r FILE_PATH="$1"
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
# Install package(s)
if [ -e "$FILE_PATH" ]; then
cat < "$FILE_PATH" | while read -r LINE; do
if [[ "$LINE" == *"#"* || -z "$LINE" ]]; then
continue
elif [[ "$LINE" == *"ppa"* || -z "$LINE" ]]; then
# ppa= Grab text enclosed by quotes following "ppa"
sudo add-apt-repository -y ppa:"$ppa" &> /dev/null \
&& sudo apt update
elif [[ "$LINE" == *"apt"* || -z "$LINE" ]]; then
package="$LINE" # Grab text enclosed by quotes following "apt"
sudo apt install --allow-unauthenticated -qqy "$package"
elif [[ "$LINE" == *"deb"* || -z "$LINE" ]]; then
#package_name= Grab text enclosed by quotes following "deb"
#url= Grab text enclosed by quotes following "args"
#target_path= Grab text enclosed by quotes following "args"
#file_name= Grab text enclosed by quotes following "args"
#file_path="$target_path" + "/" + "$file_name"
wget $url -O $file_path && \
sudo dpkg -i $file_path && sudo apt-get install -f && \
sudo rm -rf $file_path && sudo apt autoremove -qqy
fi
done
fi
}
要件リストを指定して、関数の空白を埋めるのに助けが必要です。
ここで使用されている文法は、シェルスクリプトを実行していませんが、正規表現を使用すると、そのファイルを解析するのが少し簡単になります。Bashの正規表現の比較では、グループ(...)
がBASH_REMATCH
配列に保存されるため、一度に有効な行をテストして解析できます。例えば:
#! /bin/bash
declare -A regex
regex["comment"]='^#(.*)'
regex["ppa"]='ppa "(.*)"'
regex["apt"]='apt "(.*)"'
regex["deb"]='deb "(.*)" \[args: "(.*)", "(.*)", "(.*)"\]'
while read LINE
do
if [[ $LINE =~ ${regex[comment]} ]]
then
printf "Comment: %s\n" "${BASH_REMATCH[1]}"
continue
elif [[ $LINE =~ ${regex[ppa]} ]]
then
ppa=${BASH_REMATCH[1]}
printf "PPA: %s\n" "$ppa"
elif [[ $LINE =~ ${regex[apt]} ]]
then
package=${BASH_REMATCH[1]}
printf "APT: %s\n" "$package"
elif [[ $LINE =~ ${regex[deb]} ]]
then
package_name=${BASH_REMATCH[1]}
url=${BASH_REMATCH[2]}
target_path=${BASH_REMATCH[3]}
file_name=${BASH_REMATCH[4]}
file_path="$target_path/$file_name"
printf "package_name: %s\n" "$package_name"
printf "url: %s\n" "$url"
printf "file_path: %s\n" "$file_path"
fi
done < "$1"
サンプルファイルの場合:
$ ./foo.sh foo.txt
Comment: ppa
PPA: deadsnakes/ppa
Comment: packages
APT: tree
Comment: deb
package_name: fzy
url: https://github.com/jhawthorn/fzy/releases/download/0.9/fzy_0.9-1_amd64.deb
file_path: $HOME/fzy_0.9-1_amd64.deb
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加