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