첫 번째 문자열이 두 번째 문자열로 시작하는지 확인

첫 번째 문자열이 두 번째 문자열로 시작하는지 확인

JavaScript에는 이를 달성하는 기능이 있습니다.

'world'.startsWith('w')
true

쉘을 사용하여 이를 어떻게 테스트할 수 있습니까? 나는 이 코드를 가지고 있습니다 :

if [ world = w ]
then
  echo true
else
  echo false
fi

그러나 평등을 테스트하기 때문에 실패합니다. 저는 내장 기능을 사용하는 것을 선호하지만 이 페이지의 모든 유틸리티를 사용할 수 있습니다.

http://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.html

답변1

쉘이 bash인 경우: 이중 괄호 안에 있는 == 연산자의 오른쪽은 완전히 인용되지 않는 한 패턴입니다.

if [[ world == w* ]]; then
    echo true
else
    echo false
fi

또는 더 간결하게: [[ world == w* ]] && echo true || echo false[*]

bash를 특별히 타겟팅하지 않는 경우: 패턴 일치를 위한 사례 설명 사용

case "world" in
    w*) echo true ;;
    *)  echo false ;;
esac

[*] 하지만 양식에 주의해야 A && B || C합니다 C.누구나실패한또는B는 실패했습니다. 이 if A; then B; else C; fi양식은오직A가 실패하면 C를 실행합니다.

답변2

$str변수를 다음 값으로 설정합니다(여기에서는 로 설정함 world).

str=world

그 다음에:

if [ -n "${str%%w*}" ]
then
  echo false
else
  echo true
fi
  1. w*의 시작 부분부터 패턴을 적극적으로 제거합니다 $str. w*일치 항목 w뒤에는 임의 개수의 문자가 나오므로 가능하면 전체 문자열과 일치합니다.
  2. 남은 것이 있으면 $str시작하지 마십시오 w.

또는:

if [ "$str" = "${str#w}" ]
then
  echo false
else
  echo true
fi
  1. w가능하다면 제거하십시오 $str.
  2. 그것과 비교해보세요 $str.
  3. 동일하면(즉, 삭제가 아무 작업도 수행하지 않음) $str로 시작하지 않습니다 w.

답변3

sh표준 구문은 case다음과 같은 구문입니다.

string=world
start=w
case $string in
  ("$start"*) printf '%s\n' "$string starts with $start";;
  (*)         printf '%s\n' "$string does not start with $start";;
esac

와일드카드가 포함된 경우 따옴표 가 $start필요합니다. $start예를 들어, start='*'포함 여부에 관계없이 $start*항상 일치합니다. [[ $string = "$start"* ]]ksh/bash도 마찬가지입니다.

관련 정보