배열의 각 항목에 대한 하위 문자열을 확인하세요.

배열의 각 항목에 대한 하위 문자열을 확인하세요.

명령의 출력을 기반으로 배열을 만들고 있습니다. 출력의 각 줄은 배열의 항목입니다. 그런 다음 각 항목을 반복하고 특정 문자 시퀀스를 테스트합니다.

#!/bin/bash

readarray -t LST < <(#read in single or multiline output from command)
d="sometext:123"
SUBS=":$(echo $d | cut -d':' -f 2)"
for i in "${LST[@]}"
do
  if [[ $i == *"$SUBS"* ]]
  then
    #save $i in new variable
    exit 0
  fi
done
echo "no match"
exit 1

문제는 $SUBS 변수와 관련된 것 같습니다. 위의 내용을 기반으로 $SUBS를 에코하면 123이 출력되지만 비교 결과는 분명히 false를 반환합니다. SUBS를 다음과 같이 채우면:

SUBS=":123"

비교는 예상대로인 것 같습니다. 내가 시도한 $SUBS를 채우는 다른 방법을 사용하면 비교 결과가 false인 것 같습니다. 문제는 $d에 정확히 ":123"이 포함되지 않을 수 있다는 것입니다. ":456" 또는 : 앞에 오는 다른 숫자일 수 있습니다.

답변1

Jeff Schaller가 제안한 대로 set -x를 사용하면(위 설명 참조) 출력에서 ​​/bin/bash = /bin/ksh와 유사한 줄을 발견했습니다. 이로 인해 내가 검색하고 있던 내용을 Google에 bash 대신 ksh를 사용하게 되었습니다. 나는 다음 기사를 보았다:

유닉스 쉘 스크립트에서 문자열에 다른 문자열이 포함되어 있는지 확인하는 방법

허용된 답변을 바탕으로 if 줄을 다음과 같이 변경했습니다.

if test "${i#*$SUBS}" == "$i"

이것은 내가 겪고 있던 문제를 해결하는 것 같습니다.

관련 정보