4개의 변수 중 하나가 "&red" 문자열로 시작하는지 확인하려고 하며 일치하는 항목이 작동하도록 하려고 합니다. 현재 나는 이것을 가지고 있습니다.
if [[ $filemsgCICS = "&red"* || $filemsgCICSU1 = "&red"* || $snufmsgCICS = "&red"* || $snufmsgCICSU1 = "&red"* ]];then
그러나 이것은 작동하지 않습니다. 효과적인 해결책을 찾을 수없는 것 같습니다. '&red'* 및 \&red*를 시도했지만 둘 다 작동하지 않습니다.
답변1
${variable:offset:length} 구문을 사용하여 다음과 같이 변수의 일부를 가져올 수 있습니다.
if [[ ${filemsgCICS:0:4} = "&red" || ${filemsgCICSU1:0:4} = "&red" || \
${snufmsgCICS:0:4} = "&red" || ${snufmsgCICSU1:0:4} = "&red" ]]; then
편집하다:*가 [[ ]]와 일치하지 않는다는 내 의견이 잘못되었습니다. 변수에 예상 텍스트가 포함된 경우에도 접근 방식이 작동해야 합니다. 그래서 이것은 단지 대안일 뿐입니다.
답변2
awk
and 루프를 사용할 수 있습니다 for
.
matched=0
for var in "$filemsgCICS" "$filemsgCICSU1" "$snufmsgCICS" "$snufmsgCICSU1";do
if [ ! -z "$(printf "%s\n" "$var" | awk '/^\&red/')" ]; then
matched=1
break
fi
done
if [ "$matched" -eq 1 ]; then
# do stuff...
fi
이는 첫 번째 일치 변수에서 루프를 중단하여 논리적 OR 의미 체계를 구현합니다. awk
다음과 같은 것을 사용하여 여전히 이를 달성할 수 있습니다.
if [ ! -z "$(printf "%s\n" "$filemsgCICS" | awk ...)" ]\
|| [ ! -z "$(printf "%s\n" "$filemsgCICSU1" ...
하지만 제 생각에는 루프를 사용하면 더 읽기 쉽고 유지 관리도 더 쉬워집니다.