쉘 스크립트 변경

쉘 스크립트 변경

저는 bash 스크립트를 사용하여 CLI에서 자동화된 테스트를 수행하고 있습니다. 갑자기 작동하지 않는 것 같습니다. 우리 개발자들이 운영 체제를 일부 변경한 것 같습니다.

내가 본 오류는

bash-3.2$ sh cli-unit.sh 
cli-unit.sh: line 53: syntax error near unexpected token `('
cli-unit.sh: line 53: ` if ! diff < (echo "$EXPECTED") < (echo "$FOUND") > /dev/null; then'

코드 부분은

runTest() {
    local TITLE="$1"
    local BODY="$2"
    COUNTER=$((COUNTER + 1))

    local SHELL=$(getShell "$BODY")
    local EXPECTED=$(getOutput "$BODY")
    local FOUND=$(eval "$SHELL")

    if ! diff <(echo "$EXPECTED") <(echo "$FOUND") > /dev/null; then
        echo "--- FAIL: $TITLE"
        diff <(echo "$EXPECTED") <(echo "$FOUND")
        return 1
    fi
    PASSED=$((PASSED + 1))
    return 0
}

누군가 이 문제를 변경/수정하도록 도와줄 수 있나요? 나는 그것을 고칠 수 없다. 미리 감사드립니다.

답변1

귀하의 스크립트는 분명히 bash스크립트이지만 sh.

명시적으로 sh스크립트를 시작하는 대신

  1. 사용 bash하거나
  2. 스크립트를 실행 가능하게 만들고 첫 번째 줄 #!bash인터프리터를 가리키는 적절한 -line을 추가한 다음 를 사용하여 스크립트를 실행합니다 ./cli-unit.sh.

sh쉘은 특정 bash쉘 구문을 이해할 것으로 기대할 수 없습니다.


귀하가 보여준 스크립트의 내용에 대해 몇 가지 추가 질문이 있습니다.

  • 실수로 시스템 환경 변수와 충돌하지 않도록 소문자 쉘 변수 이름을 사용하십시오. 코드에서는 SHELL현재 셸의 인터프리터에 대한 경로(일반적으로 경로)를 설정합니다 .
  • diff문자열 비교에는 사용하지 마십시오 . 불평등을 테스트 하십시오 if [ "$variable1" != "$variable2" ].
  • printf가변 데이터를 출력하는 대신 사용합니다 echo("왜 printf가 echo보다 나은가요?").

해결하다 diff:

if [ "$FOUND" != "$EXPECTED" ]; then
    # code as before
    return 1
fi
# code as before
return 0

지점 내에서는 if계속 diff사용할 수 있습니다.전시하다차이점(특히 다른 스크립트나 사용자의 경우예상하다이 스크립트의 출력). 또 다른 옵션은 다음과 같습니다

if [ "$FOUND" != "$EXPECTED" ]; then
    # $FOUND is different from $EXPECTED
    printf 'FAIL (%s): Found: %s\n' "$TITLE" "$FOUND"
    printf 'FAIL (%s): Expected: %s\n' "$TITLE" "$EXPECTED"
    # other code here
 fi
 # rest of script

또는 그런 것.

관련 정보