ファイル編集およびコピー用のスクリプトを改善する方法

ファイル編集およびコピー用のスクリプトを改善する方法

私は最近、コーディングの経験がほとんどなく、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

おすすめ記事