if에서 에코가 작동합니까?

if에서 에코가 작동합니까?

다음 기능을 고려하십시오:

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
}

위의 함수는 원하는 결과를 얻었습니다. 문법적으로는 맞지만 논리적으로는 틀린 글을 쓰는 걸 싫어해요

관련 정보