シェル変数のbash適性インストールパッケージのリスト

シェル変数のbash適性インストールパッケージのリスト

私はDebian GNU / Linux 8 Jessieを使用しており、シェル変数のbashスクリプトに適したパッケージをインストールしようとしています。シェル変数は単一のパッケージ「pkg1 pkg2 pkg3...」と解釈され、見つからないか、リストの最初のパッケージのみが検証されます。

#!/usr/bin/env bash

set -euo pipefail
IFS=$'\n\t'

# being treated as a single package with spaces in the name
# package "git gist curl build-essential cmake " not found
apt_packages="$(cat packages.txt | grep -Ev '^$|^#' | tr '\n' ' ')"

# only the first package (git) in the list is parsed and installed
apt_packages=( "$(cat packages.txt | grep -Ev '^$|^#')" )

aptitude install "$apt_packages"

あなたがpackages.txt想像するものは次のとおりです。

git
gist
curl

# build from source
build-essential
cmake

ベストアンサー1

からコメントを削除すると、スペースで区切られたpackages.txtパッケージ名のリストが表示されます。文字列をスペースで区切られた部分に分割するシェル演算子(引用符なしの変数またはコマンドの置き換え)があります。引用符なしの拡張は実際には「split+glob」演算子です。拡張結果をリストとして扱います。グローバルモードどちらを拡張する必要がありますか?ただし、debパッケージ名にはシェルワイルドカードが含まれていないため、globフェーズでは何もしないため、分割+glob演算子を使用できます。

デフォルトでは、空白と改行はどちらも有効な区切り文字であるため、改行を空白に変換する必要はありません。ただデフォルト値を維持してくださいIFS。そして、複数の区切り文字は1つだけ良いので(区切り文字が空白の場合)、空白行を削除する必要もありません。

aptitude install $(grep -v '^#' packages.txt)

おすすめ記事