Bash는 함수 인수를 프로그램으로 인식합니다.

Bash는 함수 인수를 프로그램으로 인식합니다.

저는 bash 구문을 처음 접했고 '.bash_aliases' 파일에 코드 조각이 있습니다. 인수로 정수를 얻거나 문자 'c'를 얻습니다. 정수를 얻으면 해당 정수를 웹 서버에서 포트로 사용할 수 있는 환경 변수에 넣습니다. 입력으로 문자 'c'를 얻으면 변수가 지워집니다.

정수로 명령을 실행하려고 하면 오류가 발생합니다.

main@linuxWSL:~$ serverp 2000
-bash: [: missing `]'
2000: command not found

문자 'c'를 사용하여 시도하면 다음과 같은 결과가 나옵니다.

main@linuxWSL:~$ serverp c
-bash: [: missing `]'
c: command not found

이것은 내 bash 코드입니다.

serverp () {
  if [ "$1" = "clear" || "$1" = "c" ]
  then
    unset PORT
    echo -e "\e$CLEAR$GREEN""mWebServer port has been reset!""$CLEAN"
    return 0
  fi

  export PORT="$1"
}

누군가 나를 도와줄 수 있나요? 감사합니다!

답변1

[쉘 파서가 명령줄의 나머지 부분을 다르게 해석하게 만드는 Bash의 키워드가 아닙니다. 또는 [과 같은 명령입니다 . (like )는 Bash에 내장되어 있지만 이는 추가 프로세스를 생성하지 않고도 실행할 수 있다는 의미일 뿐이며 여전히 명령처럼 작동합니다.catecho[echo

그리고 분명히 말하면 구문 [ … ]의 일부가 아닙니다 if … then …. if단지 일부 코드의 종료 상태를 테스트합니다. if true; then …유효함, if sleep 5; then …유효함, 유사하게 if [ … ]; then …유효함( [ … ]부분 자체가 유효한 명령인 경우).

[시스템에 실행 파일이 있을 수 있습니다 . 노력하다 type -a [. 와 비교해보세요 type -a [[. 와는 반대로 [는 Bash의 키워드이며 파서가 와 [[사이의 항목을 특별히 처리하도록 만듭니다 .[[]]

[키워드가 아닙니다. 가 마지막 인수인 [ … ]명령이 올바르게 작성되었습니다 . 마지막 인수로 요구합니다 . 그렇지 않으면 작동을 거부합니다. 이는 마치 특별한 구문인 것처럼 블록으로 눈에 띄게 만들기 위한 것입니다. 하지만 특별한 구문은 아닙니다.][][ … ]

귀하는 [ "$1" = "clear" || "$1" = "c" ]쉘에 의해 으로 해석되고 [ "$1" = "clear""$1" = "c" ]연결됩니다 ||. 따라서 두 가지 명령이 있습니다. 첫 번째 명령은 [ "$1" = "clear"실행 [되며 마지막 인수로 가져오지 않고 ]0이 아닌 종료 상태로 불평하고 종료됩니다. 0이 아닌 상태와 로 인해 ||쉘은 "$1"확장되는 모든 항목으로 시작하는 두 번째 명령을 실행하려고 시도합니다. 이렇게 하면 스크립트의 첫 번째 인수가 실행할 실행 파일로 해석됩니다.

다음과 같이 수정하세요 [ … || … ].

[ "$1" = "clear" ] || [ "$1" = "c" ]

이 스니펫은 두 가지로 구성됩니다.유효한 [명령. 원하는 대로 작동해야 합니다.

Note는 [[ "$1" = "clear" || "$1" = "c" ]]작동하는 코드 조각이지만 [ "$1" = "clear" || "$1" = "c" ]그렇지 않습니다. [[명령이 아니기 때문이다 . 이는 키워드이며 쉘 파서가 모든 것을 특별하게 처리하게 만듭니다 ]]. 여기에는 가 포함됩니다 ||. 다른 것도 있습니다[[와 의 차이점[, 맹목적으로 교환하지 마십시오.

[Bash의 내장 기능은 다음을 지원 합니다 -o.또는( -a그리고그리고), 따라서 다음과 같이 작동합니다.

[ "$1" = "clear" -o "$1" = "c" ]

||(셸에 특별함)이 -o(셸에 특별하지 않음) 로 대체된 코드입니다 . 그래도 피해야 합니다 -o. 에서이 기사:

바이너리 -a-o[…]는 POSIX 표준에 대한 XSI 확장입니다. POSIX-2008에서는 모두 더 이상 사용되지 않는 것으로 표시됩니다. 새 코드에서는 사용하면 안 됩니다. [ A = B -a C = D ](or ) 의 실질적인 문제 중 하나 는 POSIX가 4개 이상의 인수를 사용하여 또는 명령 -o의 결과를 지정하지 않는다는 것입니다 . 아마도 대부분의 쉘에서 작동하지만 믿을 수는 없습니다. POSIX 쉘용으로 작성해야 하는 경우 대신 연산자 로 구분된 두 개의 또는 명령을 사용해야 합니다 .test[test[&&

기사에서는 에 대해 자세히 설명하므로 -a" &&대신 연산자"를 사용하십시오. 귀하의 경우에는 각각 -o및 입니다 ||. 운영자 에 의해 분리된 두 개의 테스트가 ||바로 우리의 솔루션입니다.

답변2

그것은 if [ "$1" = "clear" ] || [ "$1" = "c" ].

관련 정보