Чтобы применить изменения к вашей текущей оболочке, вам нужно «исходить» из нее, а не «выполнять» ваш скрипт. Итак, если ваш сценарий называется «script.sh», то вместо его выполнения как ./ script.sh
используйте исходный код . ./script.sh
, и ваши изменения будут применены к текущему сеансу.
Вы можете просто использовать 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
как переменную, которая должна была быть массивом для итерации.
Если вы хотите выйти из скрипта только при отсутствии какой-либо команды:
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
Примечания: