如何改进编辑和复制文件的脚本

如何改进编辑和复制文件的脚本

我最近开始编写 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

首先,总是引用你的变量如果它们存储文件名,则该值会加倍,因为它们可以包含除 NUL ( \0) 和/.您还进行了一些不必要的移动和创建临时文件,并且没有任何错误检查,因此即使其中一个步骤失败,其他步骤也会继续并可能导致问题。接下来,作为一般规则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

相关内容