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