파일 편집 및 복사용 스크립트를 개선하는 방법

파일 편집 및 복사용 스크립트를 개선하는 방법

저는 최근 코딩 경험이 거의 없이 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( ) 및 . 이외의 항목을 포함할 수 있으므로 이는 두 배가 됩니다. /또한 불필요한 임시 파일 이동 및 생성을 수행하고 있으며 오류 검사가 없으므로 단계 중 하나가 실패하면 다른 단계도 계속 진행되어 문제가 발생할 수 있습니다. 다음은 원칙적으로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

관련 정보