다음 기능을 고려하십시오:
function testForBinary {
someBin=$(command -v binary)
# Test if binary is installed
if [[ -n $someBin ]]; then
installSuccess="Success"
echo ${installSuccess}
return
else
# This should never be reached
return 1
fi
}
(에서 가져옴문맥):
function installAndTestForDialog() {
# dialog allows me to create a pretty installer
# It is a required dependency since XXXXX
# Name Removed as I'm attempting modularization
# of a script from Github that's one huge Script
# See https://unix.stackexchange.com/questions/85249/why-not-use-which-what-to-use-then
local dialogBin
local updated=false
local dialogInstallSuccess
dialogBin=$(command -v dialog)
if [[ -z $dialogBin ]]; then
printf "Installing dialog... "
if [[ $updated -eq 0 ]]; then
apt-get update > /dev/null 2>&1
updated=true
fi
# Debian Based OS
apt-get -y install dialog > /dev/null 2>&1
# Test if dialog is installed to verify installation
# above was successful.
dialogBin=$(command -v dialog)
if [[ -n $dialogBin ]]; then
# I cannot get this to echo success
# if I echo from here
dialogInstallSuccess="Success"
# Moving it here doesn't help either Why??
echo ${dialogInstallSuccess}
return
else
# This should never be reached
return 1
fi
fi
}
부울로 처리하려고 하는데 installSuccess
뭔가 잘못되었습니다. 위와 같이 함수를 작성한 후 다음을 추가하면:
isInstalled=$(testForBinary)
echo "$isInstalled"
isInstalled
빈 행을 반환합니다. command -v binary
함수 외부에서 실행 하면 binary
결과에 대한 경로가 다음과 같기 때문에 이것이 사실이 아니라는 것을 알고 있습니다 .
산출(문맥):
Function and Variable Output Test
=====================
# These are other tests
# I'm performing, but note
# the blank line, which should
# print Success
2.9-MODULAR
192.168.1.227
false
false
(blank line)
답변1
이것은 당신이 만든 것만큼 복잡하고 취약할 필요는 없습니다.
installAndTestForDialog() {
if command -v dialog &> /dev/null; then
return 0
else
apt-get update &> /dev/null
apt-get -y install dialog &> /dev/null
fi
}
대화 상자가 이미 설치된 경우 이 함수는 0을 반환합니다. 그렇지 않으면 설치를 시도하고 apt-get install
명령의 종료 코드를 반환합니다.
@muru가 의견에서 지적했듯이 이는 다음과 같이 단순화될 수 있습니다.
if ! command -v dialog; then
apt-get update
apt-get install -y dialog
fi > /dev/null 2>&1
아니면 이미 설치되어 있는지 확인하지 않고 설치해 보세요.
{ apt-get update && apt-get -y --no-upgrade install dialog ;} >/dev/null 2>&1
이 옵션은 이미 설치되어 있는 경우 --no-upgrade
업그레이드를 방지합니다 .dialog
답변2
function installAndTestForDialog {
# dialog allows me to create a pretty installer
# It is a required dependency since Pinecraft 1.1
# See https://unix.stackexchange.com/questions/85249/why-not-use-which-what-to-use-then
local dialogBin
local updated=false
local dialogInstallSuccess
dialogBin=$(command -v dialog)
if [[ -z "$dialogBin" ]]; then
printf "Installing dialog... "
if [[ $updated -eq 0 ]]; then
apt-get update > /dev/null 2>&1
updated=1
apt-get -y install dialog > /dev/null 2>&1
fi
# This was the issue. The install of dialog
# cannot be included with the post install test
# Moving it up, to "break the nesting" solves the issue
fi
# Test if dialog is installed to verify installation
# above was successful.
dialogBin=$(command -v dialog)
if [[ -n "$dialogBin" ]]; then
dialogInstallSuccess="Success"
echo "${dialogInstallSuccess}"
return
else
# This should never be reached
return 1
fi
# Moved the fi that was here up. See comment above
}
위의 함수는 원하는 결과를 얻었습니다. 문법적으로는 맞지만 논리적으로는 틀린 글을 쓰는 걸 싫어해요