我将 Ubuntu 16.04 与 Bash 结合使用,并创建了这个无扩展名、无 shebangless 文件/etc/cron.daily/cron_daily
:
for dir in "$drt"/*/; do
if pushd "$dir"; then
wp plugin update --all --allow-root
wp core update --allow-root
wp language core update --allow-root
wp theme update --all --allow-root
popd
fi
done
"$rse"
我这样做的原因是为了减少对crontab
.
我想问一下文件的命名是否安全,整体语法和变量扩展是否正常。
和drt
变量rse
在其文件被获取并可用后已导出。
答案1
查看我有权访问的 Ubuntu 计算机上同一位置的其他脚本,很明显这些脚本应该是正确的 shell 脚本。它们应该是可执行的,并且有一个#!
指向正确解释器的 -line 。
自从你预计如果变量drt
被设置为某个值,您应该检查它是否实际设置并且设置为合理的值。例如,if$drt
应该是现有目录的路径名:
if [ ! -d "$drt" ]; then
echo 'drt is unset or does not contain path to directory' >&2
exit 1
fi
同样对于rse
:
if [ -z "$rse" ]; then
echo 'rse is unset' >&2
exit 1
fi
这将在脚本开始时完成。
目录检查
pushd
主要popd
用于交互使用(这可能有争议)。另外,读取和维护来回更改目录的脚本也很困难。也许不在这个脚本中,但在一般情况下。
您可以使用以下命令,而不是更改工作目录,执行某些操作,然后再更改回来
( cd "some directory" && "some other command" )
以上cd
仅影响( ... )
子shell。
在这个脚本中,可能就足够了
if cd "$dir"; then
command1
command2
# etc.
fi
假设这$drt
是一个绝对路径,并且简单的命令$rse
能够正确运行,无论它从哪里开始(这会将脚本留在if
- 语句之后修改后的工作目录中)。请参阅其他脚本以/etc/cron.daily/
了解它们的工作方式(上面的建议是/etc/cron.daily/dpkg
脚本的工作方式,但在其 - 语句之后没有其他命令if
)。
for
正确缩进-loop 和-statement的主体将使脚本受益if
。
使用原始示例代码,可以这样完成:
#!/bin/bash
for dir in "$drt"/*/; do
if pushd "$dir"; then
wp plugin update --all --allow-root
wp core update --allow-root
wp language core update --allow-root
wp theme update --all --allow-root
popd
fi
done
"$rse"
缩进可以使用空格或制表符来完成(这是一个品味问题)。
此外,我在写这篇文章时多次输错了你的变量名。拥有描述性变量名称对您自己(几周后)和任何试图弄清楚您的脚本应该做什么的人都有好处。在脚本中使用短变量名没有任何好处,因为它会导致代码晦涩难懂。此外,我对这些变量在其他地方设置这一事实感到不安,因为这意味着依赖于脚本中未知且未记录的内容。