以下のファイルがあります(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
評価も実行されません。ただし、ファイルには1行しかない可能性があるため、繰り返すことは意味がありません。次のようにしてください。
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
実際にファイルのデータを繰り返す必要はありません。