如果条件写入功能

时间:2019-01-12 14:29:15

标签: bash function if-statement conditional-statements

我正在尝试将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"

谢谢!

3 个答案:

答案 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())。