명령의 출력을 기반으로 배열을 만들고 있습니다. 출력의 각 줄은 배열의 항목입니다. 그런 다음 각 항목을 반복하고 특정 문자 시퀀스를 테스트합니다.
#!/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"
이것은 내가 겪고 있던 문제를 해결하는 것 같습니다.