4개 변수 중 하나가 ksh에서 &red 문자열로 시작하는지 확인하세요.

4개 변수 중 하나가 ksh에서 &red 문자열로 시작하는지 확인하세요.

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

awkand 루프를 사용할 수 있습니다 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" ...

하지만 제 생각에는 루프를 사용하면 더 읽기 쉽고 유지 관리도 더 쉬워집니다.

관련 정보