대소문자 부분 문자열 함수 및 참조

대소문자 부분 문자열 함수 및 참조

문자열에 특정 하위 문자열이 포함되어 있는지 확인하기 위해 스크립트에서 간단한 함수를 사용하고 있습니다.

#!/bin/bash 
#
subs() {
    case $2 in
         *$1*)
              return 0 ;;
         *)
              return 1 ;;
    esac
}

# example 1

res="$(grep -E '^blufoobla|^blubarbla' ~/test/file)"

subs foo "$res" || echo "blufoobla" >> ~/test/file
subs bar "$res" || echo "blubarbla" >> ~/test/file

# example 2

keym=us-whatever_foo

if subs - "$keym"; then
    echo there
else
    echo nope
fi

질문 1: 제가 할 수 있나요?~ 해야 하다$1기능의 경우 모드에서 참조됩니까? 케이스 패턴에서 따옴표가 없는 변수는 glob으로 해석됩니다. 그래서 - 제 생각에는 - 이 특별한 경우에는 변수를 인용할 필요가 없습니다. 하지만 잘 모르겠어요...

질문 2: 제가 할 수 있나요?~ 해야 하다함수의 첫 번째 매개변수( subs foo "$res"또는 subs "foo" "$res"/ subs - "$keym"또는 subs "-" "$keym"..?

나는 과도한 인용을 피하고 싶다.

답변1

함수의 대소문자 패턴에서 $1을 인용해야 합니까?

패턴이 되기를 원하시나요, 아니면 하드 문자열이길 원하시나요?

즉, 패턴이 인용되지 않은 경우 다음과 일치합니다.

a='*.txt'
case file.txt in $a) echo match;; esac;

반대로 "$a"), 그렇지 않습니다.

질문 2: 함수의 첫 번째 매개변수를 인용해야 합니까( subs foo "$res" 또는 subs "foo" "$res" / subs - "$keym" 또는 subs "-" "$keym")

당신은하지 않습니다가지다도착하다. 만약 너라면알다변수의 값에 와일드카드나 IFS문자가 포함되어 있지 않거나 단어 분리기와 와일드카드를 원하는 경우에는 물론 확장 주위에 따옴표가 필요하지 않습니다.

그러나 입력이 여기 입력 파일과 같이 알 수 없는 소스에서 오는 경우 make 스크립트가 다음과 관계없이 작동하도록 할 수 있습니다.무엇데이터는 그렇습니다. 이를 위해서는 그러한 확장을 참조해야 합니다. 예, 이것이 표준 쉘 언어가 보기 흉하고 사용하기 어려운 이유 중 하나입니다. 이 점에서는 Zsh가 더 좋습니다.

그러나 정적 문자열은 -셸에 특별한 것이 아니므로 이를 인용하면 아무 작업도 수행되지 않으며 필요하지 않습니다.

관련 정보