각 줄에 정수 값이 있는 파일을 읽고 조건이 충족되면 명령문을 실행합니다.

각 줄에 정수 값이 있는 파일을 읽고 조건이 충족되면 명령문을 실행합니다.

정수 값만 있는 텍스트 파일이 있습니다. 즉, 다른 행에 다른 정수(예: 1에서 47까지)가 있습니다. 각 행을 읽고 다른 행에 있는 값을 가져오는 스크립트를 만들었습니다. 조건이 충족되면 명령문을 에코하고 싶습니다.

콘텐츠a.txt: (한 줄에 1개만, 두 번째 줄에 2개만) 1 2 3 4 5 .. 등등 47까지.

산출내가 원하는 것: 일단 5로 표시됩니다. 출력 - "완료된 단계는 5입니다"(큰따옴표 제외). 이것은 5, 10, 15, 20에서 45까지 작동합니다.

여기에 코드가 있지만 작동하지 않는 것 같습니다.

 #!/bin/bash

while IFS= read -r line; do
        if [[ $line=="5" ]] ; then
           echo "Step Completed is:" $var
        fi
done < "$1"

또한 5개의 정수 값마다 동일한 명령문을 에코하고 싶습니다. 즉, 스크립트가 5를 읽으면 에코해야 합니다. 완료된 단계는 5입니다. 10을 읽으면 다시 에코되어야 합니다. 완료된 단계는 10입니다. 이와 같이.

스크립트를 실행하려면 다음 명령을 사용합니다.

. ./al.sh a.txt

답변1

쉘 스크립트에서 이 작업을 수행하지 말고 다음을 사용하는 것이 좋습니다 awk.

awk '$1 % 5 == 0 { last_step = $1 } END { printf("Step %s completed\n", last_step ) }' <a.txt

이렇게 하면 코드가 짧고 빠르고 간단해집니다. 이 awk코드는 입력에서 발견된 5의 배수를 각각 저장하고 마지막에 발견된 최신 숫자를 인쇄합니다.

테스트(중괄호 확장이 포함된 셸에서):

$ printf '%s\n' {1..47} | awk '$1 % 5 == 0 { last_step = $1 } END { printf("Step %s completed\n", last_step ) }'
Step 45 completed

동등한 쉘 루프는 다음과 같습니다

while read number; do
    if [ "$(( number % 5 ))" -eq 0 ]; then
        last_step=$number
    fi
done <a.txt

printf 'Step %s completed\n' "$last_step"

출력을 수행하기 전에 유효한 값이 있는지 확인하기 위해 테스트를 삽입할 수 있습니다. last_step그렇지 않으면 입력에 5의 배수가 포함되지 않은 경우 가짜 출력을 얻게 됩니다.

답변2

5개 라인에 대해 "단계 완료"를 출력하려면 나머지 단계 번호를 5로 나누고 0과 비교하십시오.

#!/bin/bash

while IFS= read -r line; 
do
        if [[ $(( line %5 )) -eq  0 ]] ; then
        echo "Step Completed is: $line"
        fi
done < "$1"

line(변수가 호출되는 스크립트 에도 없습니다 var.)

마지막 줄만 원한다면 끝까지 인쇄할 때까지 기다려야 합니다. 완전한 숫자 시퀀스가 ​​있는 경우 마지막에 이를 계산할 수 있습니다.

#!/bin/bash

while IFS= read -r line; 
do
    # do whatever for the line
    echo $line >/dev/null
done < "$1"
echo "Step completed is: $(( 5 * ( line % 5 ) ))"

그렇지 않으면 마지막으로 본 것을 기억하십시오.

#!/bin/bash

while IFS= read -r line; 
do
    [[ $(( line %5 )) -eq  0 ]] && line5=$line 
    # do whatever for the line
done < "$1"
[[ ! -z "$line5" ]]  && echo "Step completed is: $line5"

관련 정보