다른 응용 프로그램의 출력을 아래 스크립트로 파이프하는 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
*
관련된:
- Bash - 구문이 혼란스러운 경우
- Bash 연산자 [[ vs [ vs ( vs ((?
- 언제 큰따옴표가 필요합니까?
- 왜 printf가 echo보다 나은가요?
printf '%s\n' "$message"
(echo "$message"
사용자가 제공한 데이터보다 더 유용하기 때문이죠) - https://www.shellcheck.net/(이렇게 하면 이러한 문제는 물론 올바른
#!
줄 누락과 같은 다른 문제도 발견할 수 있습니다)
스크립트의 첫 번째 작업 대신 이를 사용할 수도 있습니다.
case $message in
*[!\ ]*) # contains non-space
message='``` '"$message"' ```' ;;
*) # contains nothing or only spaces
message=
esac
두 위치 모두에서 사용하면 case ... esac
스크립트(적어도 표시되는 부분)를 sh
유사한 쉘로 이식할 수 있습니다.