- 인수가 입력으로 제공되는 경우 스크립트는 해당 입력 파일의 줄 수만 확인해야 하며, 그렇지 않으면 스크립트는 해당 디렉터리에 있는 각 파일의 줄 수를 표시해야 합니다.
- 스크립트 파일은 무시되어야 합니다. 즉, 스크립트 파일 개수가 표시되지 않아야 합니다.
나는 시도했다:
#!/bin/bash
if [ $# -eq 0 ]
then
for l in *.txt
do
echo $(wc -l $l)
done
else
for l in $*
do
echo $(wc -l $l)
done
fi
하지만 파일 형식(예: *.txt)을 명시적으로 언급하는 것은 허용되지 않습니다. 스크립트 파일을 제외한 모든 파일을 확인해야 합니다.
답변1
거의 이해하신 것 같아요. 당신은 basename "$0"
그것을 사용할 수 있습니다스크립트에서 스크립트 이름 찾기를 제외한 모든 항목의 줄 수를 인쇄합니다.
#!/bin/bash
if [ $# -eq 0 ]
then
for k in *
do
if [[ ! -d "$k" && "$k" != `basename "$0"` ]]
then
wc -l "$k"
fi
done
else
for k in $*
do
wc -l "$k"
done
fi
나는 자유를 취한다
k
대신 사용하세요l
(변수 이름에는 권장되지 않습니다. 링크를 찾을 수는 없지만 확실합니다( ,1
와 혼동 될 수 있음I
)).- 들여쓰기에는 공백 8개가 아닌 공백 4개를 사용합니다. 물론 최종 결정은 귀하의 몫이지만, 8개보다 4개의 공백이 더 읽기 쉽다고 말하고 싶습니다.
- 변수를 참조하세요. 변수 이름을 공백으로 구분하지 않는 것이 좋습니다.
echo
@Serg가 지적한 것처럼 불필요한 콘텐츠를 제거하십시오.
편집하다if
조건 뿐만 아니라 이를 무시하기 위해 이중 괄호와 디렉토리 테스트를 추가했습니다 .
답변2
#!/bin/bash
if [[ "$#" != 0 ]]; then
# only process the names given to us
wc -l "$@"
exit
fi
# process all regular files in this directory, avoiding this script
for f in ./*; do
if [[ "$f" != "$0" ]] && [[ -f "$f" ]]; then
wc -l "$f"
fi
done
답변3
스크립트 외에도 3개의 명령을 한 줄에 결합하여 원하는 결과를 인쇄할 수 있습니다.
예를 들어.
find . -maxdepth 1 -type f -name "*.txt" -exec cat {} + | wc -l
현재 디렉터리에서만 검색하지 않고 라인 수를 재귀적으로 계산하려는 경우 "-maxlength 1" 스위치를 제거하거나 필요에 따라 숫자를 변경할 수 있습니다.