구글링해서 이런 글을 찾았습니다.게시물 링크. 거기에서 다음 프로그램/도구 설치 여부를 제어하는 명령을 찾았습니다. 그래서 나는 그것을 사용하기로 결정했습니다.
#!/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 관련 구문을 사용합니다.
- 때때로 명령 이름이 패키지 이름과 다르다는 점을 고려하면 이러한 경우 두 번째 기능이 작동하지 않습니다.