예를 들면 다음과 같습니다.
첫 번째
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
이 경우에는 과잉입니다.