実行可能ファイルが存在することを確認し、存在しない場合はインストールしてください。

実行可能ファイルが存在することを確認し、存在しない場合はインストールしてください。

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 -vif条件の戻りコードを使用して、インストールされていることを簡単に確認できます。いいえインストール済み

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 -vPOSIXと互換性があります。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

メモ:

  1. 上記のコードはBash関連の構文を使用しています。
  2. 場合によっては、コマンド名がパッケージ名と異なることを考慮すると、この場合、2番目の機能は機能しません。

関連情報