我正在努力寻找一种减少代码重复的方法。特别是在检查变量是否已设置时。我的代码目前如下所示:
# webadmin enabled
if [ -f "${servercfgfullpath}" ]; then
webadminenabled=$(grep "ControlPanelEnabled" "${servercfgfullpath}" | sed 's/^.*value="//' | cut -f1 -d"\"")
if [ ! -n "${webadminenabled}" ]; then
webadminenabled="NOT SET"
fi
else
webadminenabled="\e[0;31mUNAVAILABLE\e[0m"
fi
# webadmin port
if [ -f "${servercfgfullpath}" ]; then
webadminport=$(grep "ControlPanelPort" "${servercfgfullpath}" | tr -cd '[:digit:]')
fi
if [ ! -n "${webadminport}" ]; then
webadminport="0"
fi
在夏季,代码首先检查配置文件是否可用,如果不可用,则向用户显示“不可用”。如果配置文件可用,将尝试从配置文件向用户获取特定信息,如果失败,它将显示“NOT SET”。
如果只使用几次,这并不是一个真正的问题,但是它会重复很多次,尽管有效,但它远非理想,因为它很难阅读。
我相信 serverconfigpath 变量很容易改进,但是我想创建一个函数或一种方法,如果变量无法获取所需的信息,则可以简单地将变量设置为“未设置”。
关于如何简化此代码的任何想法或指示?
这是包含有问题代码的特定文件https://github.com/dgibbs64/linuxgsm/blob/master/functions/info_config.sh
答案1
变量赋值可以简化如下:
if [ ! -n "${varname}" ]; then
varname="some default"
fi
相当于
varname=${varname:-"some default"}
而且,更简洁的是,
: ${varname:="some default"}
为了将其参数化为任意变量名称和默认值,我建议定义一个函数。bash
坚持使用显式变量名称来进行参数替换${...}
,因此指定间接变量或命令而不是变量名似乎不可能(对我来说):
#!/bin/bash
# exec_with_default
# Assign command output to specified variable, or assign default value if
# output empty
#
# $1 : command
# $2 : variable to be set
# $3 : default value for variable
function exec_with_default {
local t="$($1)" # Assign command output to temporary variable t
: ${t:="$3"} # Perform bash parameter subsitution on t
eval "$2=\$t" # Indirectly assign t to variable name provided in $3
}
exec_with_default "echo something" "varname" "not set"
echo $varname
exec_with_default "echo" "varname" "not set"
echo $varname