Проверить наличие исполняемого файла и установить, если нет

Чтобы применить изменения к вашей текущей оболочке, вам нужно «исходить» из нее, а не «выполнять» ваш скрипт. Итак, если ваш сценарий называется «script.sh», то вместо его выполнения как ./ script.sh используйте исходный код . ./script.sh, и ваши изменения будут применены к текущему сеансу.

1
28.03.2018, 15:39
2 ответа

Вы можете просто использовать 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как переменную, которая должна была быть массивом для итерации.

3
27.01.2020, 23:18

Если вы хотите выйти из скрипта только при отсутствии какой-либо команды:

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. Учтите, что бывают случаи, когда имя команды и имя ее пакета различаются, поэтому вторая функция в этих случаях работать не будет.
1
27.01.2020, 23:18

Теги

Похожие вопросы