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