문자열에서 패턴을 찾는 쉘 테스트

문자열에서 패턴을 찾는 쉘 테스트

일반적인 쉘(bash, dash, kornshell)에서 실행할 수 있는 명령이 있는지 묻고 싶었습니다. line변수에 경로의 일부가 포함되어 있는지 확인해야 합니다 .

if [[ $line =~ "$PWD"$ ]] ;then

답변1

POSIX 호환 셸에서 다음을 수행할 수 있습니다.

case $line in (*"$PWD"*)
#    whatever your then block had
;;esac

이는 bash, dash, 및 이름을 지정할 수 있는 기타 모든 셸에서 작동합니다.

또한 여러 가능성을 쉽게 처리하는 데 사용할 수도 있습니다. 예를 들어:

case $line in 
(*"$PWD"*)
    echo \$PWD match\!
;;
(*"$OLDPWD"*)
    echo \$OLDPWD match\!
;;
(*)
    ! echo no match\!
;;esac

교대를 사용할 수도 있습니다.

case $line in (*"$PWD"*|*"$OLDPWD"*)
    echo '$OLDPWD|$PWD match!'
;;esac

위 인용문의 사용에 유의하세요.

  1. case $line ...
    • 명령문의 객체는 case분할되거나 $IFS파일 이름 gen에 대한 패턴으로 사용되지 않습니다. 이는 [[테스트에서 왼쪽 매개변수를 처리하는 방법 과 유사합니다 .
  2. (*"$PWD"*)
    • 여기서 쉘 확장은 $IFS파일 이름 생성에 영향을 받지 않습니다. 따옴표가 없는 확장은 분할되거나 와일드카드로 지정되지 않습니다.
    • 그러나 여기서 인용되지 않은 확장은 리터럴 문자열이 아닌 패턴으로 해석될 수 있으므로 확장은 인용 여부에 따라 두 가지 이상의 의미를 가질 수 있습니다.
    • 문자 그대로 해석될 패턴 문자를 참조하는 것이 중요한 것처럼 문자 그대로 해석되어야 하는 패턴에 사용된 모든 변수를 인용하는 것이 중요합니다.
    • 예를 들어 $PWDa가 포함되고 따옴표가 없으면 검색할 리터럴이 *아닌 패턴 개체로 해석됩니다 .*

답변2

예, 최신 버전의 bash에서는 다음을 수행할 수 있습니다.

$ pwd
/home/terdon
$ line="I'm in /home/terdon"
$ [[ "$line" =~ "$PWD"$ ]] && echo yes
yes

zsh 및 ksh에서는 동일한 구문이 작동하지만 대시에서는 작동하지 않습니다. 내가 아는 한 대시에는 그러한 기능이 없습니다.

정규식은 변수가$line 마치다그리고 $PWD. $PWD의 어느 위치에서나 일치하는 항목을 확인하려면 $line다음을 제거하세요 $.

$ line="I'm in /home/terdon, are you?"
$ [[ "$line" =~ "$PWD" ]] && echo yes
yes

답변3

쉘 대체와 함께 조건부 행을 사용할 수 있습니다.

if [ "$line" != "${line#*$PWD}" ] ; then
    echo "Path found in line"
fi

이는 $line에서 $PWD 값을 제거하기 위해 쉘 매개변수 확장을 사용하여 수행됩니다. 문자열이 일치하지 않으면 삭제가 성공하고 $PWD 값이 해당 줄에 있습니다(즉, $line에 $PWD가 포함됨).

그러나 경로 일치를 수행하는 경우 이는 의미상 원하는 것이 아닐 수도 있습니다. 예를 들어 $PWD가 "/bin"이고 $line이 "/sbin:/usr/bin"인 경우 /usr/bin에 대해 잘못된 긍정 일치가 발생합니다("/bin"이 일치하기 때문).

이는 POSIX와 호환되며 모든 쉘에서 작동합니다.

관련 정보