아래와 같은 파일이 있습니다 (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
실제로 파일의 데이터를 반복할 필요는 없습니다.