Bash 함수는 찾을 수 없는 명령을 반환하는 경우

Bash 함수는 찾을 수 없는 명령을 반환하는 경우

이 작업을 수행하는 함수를 작성하려고 합니다.

$ test-function -u {local-path} {destination}

첫 번째 인수가 이면 -u다음 2개의 인수를 업로드/복사/재동기화할 파일의 경로 및 대상으로 사용하는 함수를 실행합니다.

$ test-function -d {local-path} {destination}

첫 번째 인수가 -u(또는 -d)인 경우 다음 2개의 인수를 다운로드/복사/재동기화할 파일의 경로(현재 폴더에 있다고 가정)와 대상으로 사용하는 함수를 실행합니다.

해결책을 제안하는 답변을 찾았습니다.여기그리고여기. 그러나 내 함수는 .bash_profile다음과 같은 오류를 반환합니다.

function test_func {
    local a="$1"
    local a="$2"

    if ( a == "-u" ); then
        echo "This means upload"
    else
        echo "This means download"
    fi
}

alias test-function="test_func"

그 다음에:

$ test-function -u
-bash: a: command not found
This means download
$ test-function -d
-bash: a: command not found
This means download

코드를 다음과 같이 변경하면:

if [[a == "-u"]]; then
...

때로는 다음과 같이 진행됩니다.

$ test-function -u
-bash: [[a: command not found
This means download

내가 찾은 답변 중 하나를 기반으로 코드를 변경하는 경우:

if ((a == "-u")); then
...

때로는 다음과 같이 진행됩니다.

line 53: syntax error near unexpected token `}'

이 오류는 double 과 관련이 있는 것 같습니다 ((...)). 어떻게 하나요?

답변1

오류는 다음과 같습니다.

if ( a == "-u" ); then
    echo "This means upload"
else
    echo "This means download"
fi

구성 if에는 true 또는 false로 평가되는 표현식이 필요합니다. 예를 들어 명령( if ls; then echo yes;fi) 또는 테스트 구조입니다. 테스트 구성을 사용하려고 하는데 테스트 연산자( )를 사용하는 대신 [괄호를 사용합니다.

괄호는 서브쉘을 엽니다. 따라서 이 표현은 "인수를 사용하여 서브셸에서 명령을 실행합니다 ( a == "-u" ). 원하는 것은 다음과 같습니다.a=="-u"

if [ "$a" = "-u" ]; then  ## you also need the $ here
    echo "This means upload"
else
    echo "This means download"
fi

[[ ]]또는 에서 작동하는 이식 불가능한 구성을 사용하려면 bash후행 공백을 추가해야 합니다 [[.

if [[ "$a" == "-u" ]]; then
    echo "This means upload"
else
    echo "This means download"
fi

if [[a == "-u" ]]셸을 [[a단일 명령으로 읽으려고 했지만 실패했습니다.

마지막으로 이 (( ))구조는 이식성이 없지만 산술 평가를 위해 bash(및 일부 다른 셸)에서 작동합니다. 에서 man bash:

  ((expression))
          The  expression is evaluated according to the rules described below under
          ARITHMETIC EVALUATION.  If the value of the expression is  non-zero,  the
          return  status  is  0; otherwise the return status is 1.  This is exactly
          equivalent to let "expression".

따라서 이 경우에는 사용하고 싶은 것이 아닙니다. 이 모든 것을 종합하면 다음과 같은 것을 원합니다.

function test_func {
    local a="$1"

    if [ "$a" = "-u" ]; then
        echo "This means upload"
    else
        echo "This means download"
    fi
}

alias test-function="test_func"

답변2

공식 구문을 사용하고 [....을 ]사용하여 test호출해 보세요.

  • ( ... )서브셸 만들기

  • (( ))대신 숫자를 선호하는 ksh 특정 내부 산술 표현식입니다.-u

관련 정보