쉘 스크립트의 모든 매개변수를 반복합니다.

쉘 스크립트의 모든 매개변수를 반복합니다.

쉘 스크립트를 만들었지만 스크립트에 인수로 전달된 각 파일의 줄 수를 인쇄하는 루프를 실행하는 방법을 모르겠습니다. 출력은 다음과 같습니다.

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

대체 용도 whileshift

while [ $# -gt 0 ] ; do
    printf '%u lines in %s\n' $(wc -l < "$1") "$1"
    shift
done

관련 정보