我正在编写一个 bash 脚本来配置 NFS 服务器。我能够手动配置 NFS 服务器并且它功能齐全。 现在我想在 bash 脚本中重现相同的步骤。 我有所有的步骤,每一步,shell 命令,我都放入 bash 函数中。 然后我有一个主要部分,我在那里进行函数调用,总共有 16 个函数。 在主要部分我想检查函数返回值,通常只是“$?”值
if [ "function_1" -eq "0" ]; then
echo "Success"
else
echo "Failure"
fi
由于有 16 个函数调用,每个函数调用都依赖于前一个函数才能成功,所以整个事情变得有点笨拙
if [ "function_1" -eq "0" ]; then
if [ "function_2" -eq "0" ]; then
if [ "function_3" -eq "0" ]; then
if [ "function_..." -eq "0" ]; then
if [ "function_16" -eq "0" ]; then
我的问题是,这是构建程序的正确方法还是根本不使用函数而只在主要部分进行命令验证会更好
chmod -R 0755 $SHARED_FILE_SYSTEM
if [ "$?" -eq "0" ]; then
echo "Success"
else
echo "Failure
fi
最佳答案
一个选项是制作一个函数列表并循环运行它们,如 Shellcheck 所示。 -干净的代码:
#! /bin/bash -p
# ...
config_functions=(
function_1
function_2
# ...
function_15
function_16 )
for cfunc in "${config_functions[@]}" ; do
if "$cfunc" ; then
printf 'Success: %s\n' "$cfunc"
else
printf 'Failure: %s (%d)\n' "$cfunc" "$?"
fi
done
- 没有必要明确地检查
$?
和Shellcheck如果你这样做会发出警告。参见 Shellcheck SC2181 . - 如果您想在任何函数失败时立即停止,请适本地将
break
或exit "$?"
放入如果
。
如果函数接受参数,这种方法也很有效,但前提是参数始终相同。 (只需将参数添加到循环中的函数调用即可。)如果不同的函数采用不同的参数,则效率会降低。您可以尝试将完整的函数调用放在数组的字符串中,但处理需要引用的参数很棘手。
考虑使用配置管理工具,例如 Chef , Puppet , Ansible , 或 Salt配置您的 NFS 服务。与脚本相比,它们有很多优势。
关于bash - 订购功能和条件的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55601273/