私は最近、コーディングの経験がほとんどなく、bashスクリプトを書くようになりました。
これは大きなスクリプトのサブセクションですが、ポイントはファイル(secretinfo.md)で「42」を編集してそれをXXに置き換えてから、ファイルを新しい場所に配置することです。元のファイルを削除したくありません。
$filesは、以前にターゲットディレクトリを巡回するforループの変数として定義されました。
if [ "$files" == "source/secretinfo.md" ]
then
echo $files "is being redacted."
cd source/
cp secretinfo.md secretinfo_redacted.md
sed -i 's/42/XX/g' secretinfo_redacted.md
mv secretinfo_redacted.md ../build/
echo $files "has been copied."
cd ..
else
echo $files "is being copied into build for you."
cp $files build/.
fi
done
任意のヒントやコツを提供していただきありがとうございます。
答え1
まず、常に変数を引用してください。\0
ファイル名はNUL()と。以外の項目を含めることができるため、これは2倍になります。/
また、不要な一時ファイルの移動と作成を実行しており、エラーチェックがないため、いずれかの手順が失敗した場合は、他の手順も続行して問題が発生する可能性があります。以下は原則としてprintf
より良い選択ですecho
。最後に、$files
単一のファイルを保存するように設計されているようですので、名前をとして指定することをお勧めします$file
。意味的に一貫した変数名を使用すると便利です。これにより、数年後にそのコードを再発見したときにコードを理解するのに役立ちます。
この試み:
for file in source/*; do
if [ "$file" = "source/secretinfo.md" ]
then
printf '%s is being redacted.\n' "$file"
sed 's/42/XX/g' -- "$file" > build/secretinfo_redacted.md &&
printf '%s has been copied.\n' "$file" ||
printf 'An error occurred, %s has not been copied.\n' "$file"
else
printf '%s is being copied into build for you.\n' "$file"
cp -- "$file" build/ ||
printf 'An error occurred, %s has not been copied.\n' "$file"
fi
done