빈 메시지 문자열을 감지하는 Bash 스크립트. 가져오기: 인수가 너무 많습니다.

빈 메시지 문자열을 감지하는 Bash 스크립트. 가져오기: 인수가 너무 많습니다.

다른 응용 프로그램의 출력을 아래 스크립트로 파이프하는 bash 스크립트가 있습니다. 하지만 메시지가 비어 있는지 테스트하는 논리가 올바르지 않다고 생각합니다. 비어 있으면 아무 작업도 수행하지 않기를 원하지만 문자열에서 "error"라는 단어를 감지하면 다른 기능을 실행해야 합니다.

내 논리에 무슨 문제가 있습니까?

세 번째부터 마지막 ​​줄까지 너무 많은 매개변수를 수신하고 있는데, 이는 빈 메시지 때문일 가능성이 높습니다.

message=$( cat )

if [ -n "${message// /}" ]; then
  #execute if the the variable is not empty and contains non space characters
  message="\`\`\` ${message} \`\`\`"
else
  #execute if the variable is empty or contains only spaces
  message=""
fi

sendX() {
.....
}

if  [ -z "$message" ]; then
        echo "Please pipe a message to me!"
else
        sendX
fi

sendAlert() {
......
}

checkword="error"

echo $message

if [ $message =~ $checkword ]; then  <---- Error: too many arguments
 sendY
fi

답변1

[ ... ]정규식 일치 =~에 사용되는 연산자를 이해할 수 없기 때문에 "인수가 너무 많습니다" 오류가 발생합니다. 연산자를 이해할 수 bash없으므로 [ ... ]문자열로 처리됩니다. 그러면 [ ... ]올바른 테스트를 위한 의미론적 요구 사항을 충족하지 않는 세 개의 문자열이 내부에 있으므로 bash이 시점에서 오류가 발생합니다.

에서는 내부를 bash사용합니다 .=~[[ ... ]]

그러나 해당 테스트에서 수행하려는 작업은 하위 문자열로 $message포함되어 있는지 확인하는 것이라고 가정합니다. $checkword이 작업은 다음을 통해 수행할 수도 있습니다.

[[ "$message" == *"$checkword"* ]] && sendY

또는 다음과 같이 case ... esac:

case $message in
    *"$checkword"*) sendY
esac

$checkword이렇게 하면 정규식에 특수한 문자를 포함하는 것에 대해 걱정할 필요가 없습니다 .

파일 이름 와일드카드( 예 $message: .echo $message$message*

관련된:


스크립트의 첫 번째 작업 대신 이를 사용할 수도 있습니다.

case $message in
    *[!\ ]*) # contains non-space
        message='``` '"$message"' ```' ;;
    *)       # contains nothing or only spaces
        message=
esac

두 위치 모두에서 사용하면 case ... esac스크립트(적어도 표시되는 부분)를 sh유사한 쉘로 이식할 수 있습니다.

관련 정보