Googleでこのような記事を見つけました。投稿リンク。 そこで、次のプログラム/ツールをインストールするかどうかを制御するコマンドを見つけました。だから私はそれを使用することにしました。
#!/bin/bash
set -x
programs=$(bc nmap coreutils xmlstarlet)
if [ $(dpkg-query -W -f='${Status}' "$programs" 2>/dev/null | grep -c "ok installed") -eq 0 ];
then
apt-get update | apt-get install "$programs" -y;
fi
私がこの仕事をしっかりしているのか?それとも何か問題があるのでしょうか?
program/tool name
私は方法が必要でprograms variable
あり、それは私のコンピュータで実行されます。
答え1
command -v
if条件の戻りコードを使用して、インストールされていることを簡単に確認できます。いいえインストール済み
apt-get update
programs=(bc nmap coreutils xmlstarlet)
for program in "${programs[@]}"; do
if ! command -v "$program" > /dev/null 2>&1; then
apt-get install "$program" -y
fi
done
このオプションはcommand -v
POSIXと互換性があります。apt-get update
すべてのループ反復の代わりに一度だけ実行できます。また、programs
繰り返しのための配列でなければならない変数を定義しました。
答え2
特定のコマンドが欠落している場合にのみスクリプトを終了するには、次のようにします。
require() {
local command not_found
for command; do
if ! command -v -- "${command}" > /dev/null 2>&1; then
printf 'ERROR: Command not found: %s\n' "${command}" >&2
((not_found++))
fi
done
if ((not_found > 0)); then
printf 'ERROR: Missing commands: %d\n' "${not_found}"
exit 1
fi
}
ただし、不足しているコマンドもインストールしたい場合:
install_command_if_not_found() {
local command commands not_found
for command; do
if ! command -v -- "${command}" > /dev/null 2>&1; then
commands+=("${command}")
((not_found++))
fi
done
if ((not_found > 0)); then
sudo apt-get update
sudo apt-get install -y -- "${commands[@]}"
fi
}
例:
$ require cat foo curl bar mpv baz zenity
ERROR: Command not found: foo
ERROR: Command not found: bar
ERROR: Command not found: baz
ERROR: Missing commands: 3
メモ:
- 上記のコードはBash関連の構文を使用しています。
- 場合によっては、コマンド名がパッケージ名と異なることを考慮すると、この場合、2番目の機能は機能しません。