쉘 스크립트를 사용하여 한 파일을 읽고 다른 파일에 쓰는 방법

쉘 스크립트를 사용하여 한 파일을 읽고 다른 파일에 쓰는 방법

아래와 같은 파일이 있습니다 (file1.txt)

258.2222

file1.txt이 값을 다른 파일에 써야 합니다 . 값이 없으면(null) file1.txt"Passed"가 인쇄되어야 합니다.

이것이 내가 시도한 것입니다.

for final in $(cat file1.txt);do
if [ "$final" ];then
        echo $final  > file2.txt
else
        echo "Passed" > file2.txt
fi
done

이는 1개의 시나리오에서만 작동합니다. 값이 없으면 file1.txt다음과 같이 기록되지 않습니다."통과하다"

예상 출력:

다음에 값이 있는 경우 file1.txt:

258.2222

(null)에 값이 없는 경우 file1.txt:

Passed

누구든지 이 문제를 해결하도록 도와줄 수 있나요? 미리 감사드립니다!

참고: 범용 스크립트 언어(JavaScript, Python 등)의 사용을 허용하지 않습니다.

답변1

작동하지 않는 이유는 for루프 때문입니다. 파일에 값이 없으면 루프는 for반복할 항목이 없으므로 시작도 되지 않으므로 if평가도 수행되지 않습니다. 그러나 파일에는 한 줄만 있을 수 있으므로 반복하는 것은 의미가 없습니다. 다음과 같이 해보세요:

final=$(cat file1.txt)
if [ -n "$final" ]; then
    printf '%s\n' "$final" 
else
    printf 'Passed\n'
fi

그런 다음 스크립트를 실행하고 출력을 파일로 리디렉션합니다. 출력 파일 이름을 하드코딩하는 것은 일반적으로 나쁜 습관입니다. 이렇게 하면 실수로 동일한 이름을 가진 기존 파일을 덮어쓰게 되고 스크립트의 사용 방법도 제한될 수 있기 때문입니다.

script.sh > file2.txt

파일에 공백만 있는 경우에도 인쇄됩니다. 이는 "아무것도"가 아닌 "무언가"이기 때문입니다.

답변2

포함된 항목(파일 크기가 0이 아닌 경우)이 있는 경우 file1.txt해당 콘텐츠를 다음과 같이 넣습니다 file2.txt.

if [ -s file1.txt ]; then
    cp file1.txt file2.txt
fi

file1.txt경우비어 있는Passed(또는 누락) 다음 과 같은 줄이 필요합니다 file2.txt.

if [ -s file1.txt ]; then
    cp file1.txt file2.txt
else
    echo Passed >file2.txt
fi

file2.txt누락된 경우 생성을 방지하려면 다음을 수행하세요 file1.txt.

if [ -s file1.txt ]; then
    cp file1.txt file2.txt
elif [ -e file1.txt ]; then
    echo Passed >file2.txt
fi

이제 테스트가 실패하는 경우(파일이 존재하지 않거나 비어 있음) 및 테스트가 성공한 경우(파일이 존재하는 경우) 에만 echo실행됩니다 .-s-e

실제로 파일의 데이터를 반복할 필요는 없습니다.

관련 정보