シェルスクリプトを使用してあるファイルを読み取り、別のファイルに書き込む方法

シェルスクリプトを使用してあるファイルを読み取り、別のファイルに書き込む方法

以下のファイルがあります(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

実際にファイルのデータを繰り返す必要はありません。

関連情報