이 명령을 클래스의 일부로 이해할 수 없습니다.

이 명령을 클래스의 일부로 이해할 수 없습니다.
for f in ${FILES}; do
    ((COUNT++))
    ln=$(wc -l ${f} | cut -f 1 -d ' ')
    echo "File number ${COUNT} (${f}) has ${ln} lines"
done

답변1

for f in ${FILES}; do
    ((COUNT++))
    ln=$(wc -l ${f} | cut -f 1 -d ' ')
    echo "File number ${COUNT} (${f}) has ${ln} lines"
done

이것이 bash에서 for 루프의 모습입니다. 각 항목에 대해 (list)해당 항목의 값을 변수라는 이름으로 할당한 f다음 해당 [...]섹션을 실행합니다.

for f in (list); do
 [...]
done

아마도 이름이 지정된 파일에 공백으로 구분된 파일 이름 문자열이 할당되어 있을 것입니다.FILES

FILES="file1 file2 file3"

예를 들어 변수의 내용에 액세스하려면 FILES변수 이름 앞에 $를 추가해야 합니다. 쓰거나$FILES${FILES}

위 코드가 나열된 파일 수를 계산하려고 하기 때문에 어딘가에 0이 할당된 "COUNT"라는 변수도 있습니다.

그래서 우리는 ...

FILES="file1 file2 file3"
COUNT=0
for f in ${FILES}; do
    [...]
done

f에 새 값이 할당될 때마다 [...] 부분이 실행됩니다.

[...] 섹션에는 무엇이 있나요? 먼저 COUNT 변수를 추가합니다. COUNT++를 사용하여 증가(COUNT 변수를 1씩 증가)하려면 산술 표현식을 (())로 묶어야 합니다.

((COUNT++))

다음으로 각 파일의 줄 수를 얻습니다.

ln=$(wc -l ${f} | cut -f 1 -d ' ')

그것을 분해해 봅시다.

  1. wc -l ${f}wc우리는 (lines) 옵션 -l이 저장된 파일의 라인 수를 제공하는 (word count)라는 프로그램을 사용하고 있으며 , $f출력은 다음과 같습니다 57 file1(라인 수, 파일 이름).

  2. wc -l ${f}| cut -f 1 -d ' '우리는 행 수(57)와파일 이름이 아닙니다.wc(file1), IE의 출력을 가져와서 57 file1isolate 명령의 입력으로 사용합니다. 운영자는 한 명령의 출력을 가져와 다른 명령의 입력으로 사용합니다. 이 옵션은 필드를 공백으로 자르도록 지정합니다. 즉, 첫 번째 필드를 출력한다는 의미입니다.cut57|-d ' '-f 157

  3. $(wc -l ${f} | cut -f 1 -d ' ')이제 우리의 명령은 57. 할당될 수 있도록 출력을 캡처하려면 ln다음으로 래핑되어야 합니다.$()

최종 출력은 "파일 번호 1(file1)에 57줄이 있습니다."입니다.

echo "File number ${COUNT} (${f}) has ${ln} lines" 

관련 정보