我正在尝试将If条件编写为函数,但不确定是否可行。
以下情况:
File1
if_exit()
{
if $1; then
echo "$2"
exit 1
fi
}
File2
source File1
SUUSER=$(whoami)
if_exit "[ $SUUSER != 'root' ]" "Please run the script as root"
说明: 我想编写一个函数,其中包含If条件(此处使用的简短示例)。 然后,我想用上面代码示例中提到的不同方法调用该函数,或者:
if_exit "[ $(lsb_release -is) != 'Debian' ] && [ $(lsb_release -cs) != 'stretch' ]" "The script only works with Stretch"
谢谢!
答案 0 :(得分:2)
我会重构,这样您就不必在参数周围使用引号了。
if_exit()
{
local message=$1
shift
if "$@"; then
echo "$0: $message" >&2
exit 1
fi
}
# Tangentially, don't use upper case for private variables
Suuser=$(whoami)
if_exit "Please run the script as root" [ "$Suuser" != 'root' ]
还请注意我们如何将诊断打印为标准错误,并注意包括导致打印诊断的脚本名称。
答案 1 :(得分:0)
您可能需要尝试eval
才能按照自己喜欢的方式进行这项工作,通常需要不惜一切代价避免这种情况。对于您的用例,我建议:
function die() {
echo "$1"
exit 1
}
[ "$SUUSER" != 'root' ] && die "Please run the script as root"
[ "$(lsb_release -is)" != 'Debian' && "$(lsb_release -cs)" != 'stretch' ] && die "The script only works with Stretch"
答案 2 :(得分:0)
只有少量支票时,可以使用 [[$ SUUSER!='root']] && {echo“请以root身份运行脚本”;回声出口1; }
当您进行大量检查时,我会使用像{erik_dannenberg所写的那样的die()
函数。
离题:您应该用小写形式编写自己的shell变量,例如${su_user}
。
建议的功能的一个原因是可能显示哪个测试失败(将"${su_user}"
与root
进行比较)。当您需要时,制作一个类似
checkroot()
。要支持所有常规特殊字符,您将承担很多责任。
我尝试了[ ... ]
语法的支持。您是否知道此“解决方案”出了什么问题?
if_exit() { # incorrect function
# skip first '['
shift
# split line around ]
IFS="]" read -r testparams errormessage <<< "${@}"
if [ ${testparams} ] ; then
echo "Test [ ${testparams% } ] failed: ${errormessage# }"
# exit 1
fi
}
if_exit [ -f non_existing_file ] "file not existing"
su_user="root"
if_exit [ "${su_user}" \!= root ] "Please run the script as root"
echo "Another test with wrong user"
su_user="aeris"
if_exit [ "${su_user}" \!= root ] "Please run the script as root"
除了感叹号,看起来还不错吗?
当su_user
为空或有空格(su_user="I dont want to be tested"
时,它将失败。
您可以在if_exit()
函数中解决此问题,但仍会遇到新问题(例如文件名中的空格)。
您可以寻找test.c的源代码,但是您应该放心,然后选择其他解决方案(die()
或compare_strings()
)。