쉘 스크립트를 만들었지만 스크립트에 인수로 전달된 각 파일의 줄 수를 인쇄하는 루프를 실행하는 방법을 모르겠습니다. 출력은 다음과 같습니다.
2 lines in hello.sh
33 lines in /var/log/syslog
답변1
POSIX 쉘을 가정하면 여기에서 명령줄 인수가 포함된 for
루프를 사용하여 루프를 수행 해야 합니다 ."$@"
for filename in "$@"; do
lines=$(wc -l < "$filename")
printf '%u lines in %s\n' "$lines" "$filename"
done
모든 따옴표를 사용하는 것이 매우 중요합니다. 공백과 기타 문자가 포함된 파일 이름을 전달할 수 있습니다.
./my_script.sh /var/log/syslog "$HOME/My Dir with Spaces/a file with spaces.txt"
답변2
일반적으로 스크립트나 셸 함수에서 명령줄 인수를 반복하려면 다음을 수행합니다.
for thing do
commands using "$thing"
done
또는
for thing in "$@"; do
commands using "$thing"
done
이 경우 명령줄에 제공된 파일 이름에 리터럴 줄 바꿈이 포함되어 있지 않다고 가정하면 이에 대해 명시적인 쉘 루프를 수행할 필요가 없습니다.
wc -l -- "$@" | sed -E '$d;s/^[[:blank:]]*([[:digit:]]*)[[:blank:]]*(.*)/\1 lines in \2/'
그러면 모든 명령줄 인수가 사용되어 wc -l
모두 실행됩니다.
출력을 구문 분석하여 sed
주어진 파일의 총 줄 수를 포함하는 마지막 줄을 삭제합니다( 사용 $d
). wc -l
줄 번호와 파일 이름을 캡처한 다음 그 사이에 문자열을 삽입하여 lines in
나머지 출력을 원하는 출력으로 변환합니다 .
내 자신의 스크립트를 .vimrc
실행하면 .profile
파일이 .mailrc
반환됩니다.
8 lines in .vimrc
8 lines in .profile
4 lines in .mailrc
이렇게 하면 다음 wc -l -- "$@"
과 유사한 출력이 생성됩니다.
8 .vimrc
8 .profile
4 .mailrc
20 total
이것은 실제로 가 필요 없이 귀하의 요구에 충분할 수 있습니다 sed
.
답변3
#!/bin/bash
for file in "${@}"; do
wc -l -- "${file}"
done
#!/bin/bash
스크립트를 실행할 프로그램입니다.
${@}
위치 인수. 명령줄을 통해 스크립트에 제공하는 인수입니다.
file
인수에 지정된 변수를 반복합니다 ${@}
.
wc -l -- "${file}"
줄 수를 인쇄하는 외부 명령 ( 표준 입력의 줄 수를 인쇄하는 경우 ${file}
는 제외 )${file}
-
답변4
대체 용도 while
및shift
while [ $# -gt 0 ] ; do
printf '%u lines in %s\n' $(wc -l < "$1") "$1"
shift
done