코드 중복을 줄이는 방법을 찾으려고 노력 중입니다. 특히 변수가 설정되었는지 확인할 때 그렇습니다. 내 코드는 현재 다음과 같습니다
# 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