"if;then" 구문을 사용하지 않고 어떻게 "wc"의 출력을 부등식(-gt)으로 전달할 수 있습니까?

"if;then" 구문을 사용하지 않고 어떻게 "wc"의 출력을 부등식(-gt)으로 전달할 수 있습니까?

예를 들어, 깊이 1의 패턴과 일치하는 파일 수를 계산하고 숫자와 비교하여 그러한 파일이 3개 이상 있는지 확인하고 싶습니다. 그러나 if/then 구문을 사용하지 않고 이 작업을 수행하고 싶습니다.

그것은 다음과 같습니다:

ls -1q -d *patternX* | wc -l | [ -ge 3]

if/then 구문을 사용하여 이스케이프할 수 있는 방법이 있는지 알려주시면 매우 감사하겠습니다. 감사해요!

답변1

일치하는 이름의 수를 세고 *patternX*3보다 크거나 같은지 테스트하려는 것 같습니다.

이렇게 하는 것이 더 좋습니다:

shopt -s nullglob

set -- *patternX*
if [ "$#" -ge 3 ]; then
    echo 'More than 2 names match the pattern'
fi

그러면 위치 매개변수가 패턴과 일치하는 이름으로 설정됩니다. 일치하는 이름의 개수가 에 저장됩니다 $#. 이 nullglob옵션은 이름이 일치하지 않으면 패턴이 확장되지 않은 상태로 남아 있지 않고 완전히 제거되도록 설정됩니다.

명명된 배열을 사용하여 일치하는 이름을 저장할 수도 있습니다.

shopt -s nullglob

names=(*patternX*)
if [ "${#names[@]}" -ge 3 ]; then
    echo 'More than 2 names match the pattern'
fi

당신은 또한 볼 수 있습니다왜 `ls`를 구문 분석하지 *않나요*(그리고 어떻게 수행합니까)?


단어 없이 ifthen:

shopt -s nullglob

set -- *patternX*
[ "$#" -ge 3 ] && echo 'More than 2 names match the pattern'

비슷한 접근 방식이 사용됩니다 awk.

shopt -s nullglob

awk 'BEGIN { if (ARGC > 3) print "more than 2" }' *patternX*

ARGCin 은 awk명령 이름( $0셸의 이름)을 의미하기도 합니다.

답변2

의 경우 zsh일반적으로 다음과 같은 익명 함수를 사용합니다.

()(( $# >= 3 )) *patternX*(N)

본문이 (( $# >= 3 ))(반환되는) 익명 함수를 호출합니다.진짜인수 개수가 3개 이상인 경우) *patternX*(N)glob의 확장이 인수로 사용됩니다.

(N)nullglob일치하는 파일이 없는 경우 오류를 보고하는 대신 glob이 비어 있도록 확장되도록 이 glob을 활성화하는 옵션입니다 .

귀하가 요청한 질문에 대한 보다 직접적인 대답은 다음과 같습니다.

ls -1q -d -- *patternX* | wc -l | xargs -IN test N -ge 3

(모든 쉘에서, 그러나 패턴이 어떤 파일과도 일치하지 않을 때 다른 쉘은 다르게 작동합니다.)

또는:

[ "$(( $(ls -1q -d -- *patternX* | wc -l) ))" -ge 3 ]

(POSIX 또는 Korn과 유사한 쉘에서)

답변3

이것이 실제 문제라고 믿기는 어렵지만 해결책은 다음과 같습니다.

ls -1q -d *patternX* | wc -l | egrep '^[3-9][0-9]*|[0-9][0-9]+' && echo JA

관련 정보