コードの重複を減らす方法を見つけようとしています。特に、変数が設定されていることを確認する場合はそうです。私のコードは現在次のとおりです
# 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