루프의 파일 명령 수 계산

루프의 파일 명령 수 계산

ls *.txt | wc나중에 루프에서 사용할 수 있도록 어떻게 별도의 변수로 사용할 수 있습니까 ? 그건

count.files=$(ls *.txt | wc)
...

if count.files -ne 2000; then
echo "message"
fi

시도해 보았지만 작동하지 않는 것 같습니다.

답변1

코드에 몇 가지 오류가 있습니다.

  • 대부분의 쉘에서는 변수 이름에 점이 포함될 수 없습니다.
  • 깃발을 wc들고 전화 해야 해-l
  • 깃발을 ls들고 전화 해야 해-d
  • 옵션의 끝을 표시 --하거나 ./접두사를 사용해야 합니다.ls
  • 테스트 if에서 괄호가 누락되었습니다(하지만 스택 교환 형식일 수도 있음).
  • 파일 이름에 개행 문자가 포함된 경우 이 방법은 작동하지 않습니다.
  • 숨겨진 파일은 생략됩니다.

더 나은 작업 예는 다음과 같습니다.

file_count=$(ls -d ./*.txt | wc -l)
if [ $file_count -ne 2000 ]; then echo "message"; fi

답변2

당신이 고려하고 있는 기능은 규율이라고 생각합니다. 이것은 ksh93독특한 기능입니다:

function count.get {
  .sh.value=$(set -- ~(N)*.txt; echo "$#")
}

그러면 $count확장할 때마다규율함수를 호출하고 값을 할당합니다.

에서는 zsh변수의 내용을 코드로 정의할 수도 있습니다.

count='$(set -- *.txt(N); echo "$#")'

${(e)count}확장할 때 평가할 코드 로 사용합니다 e.

그러나 이러한 방법은 함수를 사용하는 표준 접근 방식에 비해 이점이 거의 없습니다.

count() (
  set -- [*].txt *.txt
  case $1$2 in
    '[*].txt*.txt') echo 0;;
    *) echo "$#"
  esac
)

(이 트릭은 nullglob 옵션(위의 's 또는 '와 같은)을 지원하는 쉘을 사용하여 [*]피할 수 있습니다 .)ksh93~(N)zsh(N)

그리고 그것을 $(count)(명령 대체).

(코드에 관한 모든 질문은 다른 답변을 참조하세요)

답변3

wc -l먼저, 개행 문자만 사용해야 합니다 . 이것은 작동합니다:

#!
filecounter=$(ls *.txt | wc -l)
if [ $filecounter -ne 2000 ]; then echo "message"
fi

관련 정보