설명하다

설명하다

예를 들면 다음과 같습니다.

첫 번째

cd /usr/lib

그리고 달리다

for x in $(ls);do if [ "$x" == "*.a" ];then echo $x;fi;done

제가 하고 싶은 일은 확장자가 .a인 파일을 선택하여 인쇄하는 것입니다. 이 작업을 수행하는 더 쉬운 방법이 있다는 것을 알고 있지만 이는 내 의도가 아닙니다.

문제는 위의 명령이 작동하지 않는다는 것입니다. 이유는 모르겠습니다. 나는 이것을 배웠다이 게시물

나도 시도했다

[ "$x" == *.a ]    bash: [: too many arguments
[ $x = "*.a" ]    shows nothing
[ $x = *.a ]    bash: [: too many arguments

작동한다는 것은 알지만 , 이 상황에서 테스트를 작성하는 올바른 방법이 무엇인지 [[ $x == *.a ]]알고 싶습니다 .[

답변1

for x in ./*; do
   case $x in
      *".a" ) echo "$x";;
   esac
done

구조 [는 이에 완전히 적합하지 않습니다. 하지만 당신이 주장한다면 우리는 이렇게 할 수 있습니다:

[ '.a'  =  ".${x##*.}" ]

설명하다

$x에 다음이 포함되어 있다고 가정하면 my.file.testing.a왼쪽 ${x##*.}부터 시작하여 .에서 볼 수 있는 마지막 항목 까지 가능한 한 많이 제거합니다 $x. IOW, 우리는 마침내 모든 것을 내려놓고 extension시각화를 a전면에 내세웠습니다. 이제 우리는 .a성공에 더 좋다고 생각하는 것( )과 비교하기 위해 방금 계산한 확장을 갖게 되었습니다 .

답변2

귀하의 질문에 링크한 답변은 bash(이중 괄호)를 사용합니다.확장된 테스트 구문, POSIX 단일 대괄호 테스트 연산자를 사용하려고 합니다. 차이점은 이중 대괄호 테스트에서는 ==단어 분할이나 전역 확장을 거치지 않고 an의 오른쪽이 패턴으로 처리된다는 점입니다 . 따라서 오류가 [ $f == *.a ]발생 하더라도[: too many arguments가능한하다

for f in *; do if [[ $f == *.a ]]; then echo "$f"; fi; done

또는 (더 컴팩트)

for f in *; do [[ $f == *.a ]] && echo "$f"; done

또는 을 사용하는 것 같으므로 다음과 같은 정규식 연산자를 bash사용할 수 있습니다 .=~

for f in *; do if [[ $f =~ \.a$ ]]; then echo "$f"; fi; done

또는 (더 컴팩트)

for f in *; do [[ $f =~ \.a$ ]] && echo "$f"; done

이 경우에는 과잉입니다.

관련 정보