Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash脚本elif未触发_Bash_Scripting - Fatal编程技术网

Bash脚本elif未触发

Bash脚本elif未触发,bash,scripting,Bash,Scripting,我需要一些帮助来弄清楚为什么下面脚本中的elif不起作用。if的第一部分起作用,语句的else部分起作用,但elif不起作用。换句话说,当我以“root”身份登录时,我得到了我期望的DNS地址。如果我以来宾身份登录,我会得到我期望的DNS地址,但如果我以elif中列出的任何学生的身份登录,则不会得到 #!/bin/bash \# Setting DNS by User \# Get variables. $3 is logging in user. user=$3 \# Root and

我需要一些帮助来弄清楚为什么下面脚本中的elif不起作用。if的第一部分起作用,语句的else部分起作用,但elif不起作用。换句话说,当我以“root”身份登录时,我得到了我期望的DNS地址。如果我以来宾身份登录,我会得到我期望的DNS地址,但如果我以elif中列出的任何学生的身份登录,则不会得到

#!/bin/bash

\# Setting DNS by User

\# Get variables. $3 is logging in user.
user=$3

\# Root and Admin should be wide open

if [ $user = "root" ] || [ $user = "admin" ]; then
networksetup -setdnsservers Wi-Fi 8.8.8.8
networksetup -setdnsservers Ethernet 8.8.8.8

\# Older students get an open, but filtered experience:

elif 

\# Adams class
[ $user = "Student01" ] || 
[ $user = "Student02" ] || 
[ $user = "Student03" ] ||
[ $user = "Student04" ] ||

\# Mariannes class:
[ $user = "Student05" ] ||
[ $user = "Student06" ] ||
[ $user = "Student07" ] ||
[ $user = "Student08" ]   

then
networksetup -setdnsservers Wi-Fi 8.8.4.4
networksetup -setdnsservers Ethernet 8.8.4.4

\# Everyone else gets whitelisted DNS

else
networksetup -setdnsservers Wi-Fi 208.67.222.222
networksetup -setdnsservers Ethernet 208.67.222.222

fi

exit 0

我的第一个想法是,这不是一种真正的可维护方法。这是在 我的意见不是使用if/elif/if/fi结构的方法

这就是说,我要向你扔一些高级脚本,它会做什么 你想要,而且更受支持

首先,我建议在bash数组中保留管理员和学生的名字。最后 您可以从其他源(如中所示的文件)填充这些数组 评论。这将使if/elif测试更简单,如图所示

#! /usr/bin/env bash

# Setting DNS by User

# Get variables. $3 is logging in user.
user=$3

# admin_list=$HOME/admin.list
# declare -a admins
# if [[ -f "$admin_list" ]] ; then
#     IFS=$'\n' read -d '' -r -a admins < <(sed -e 's/#.*$//' "$admin_list")
# 
#     wait $! || return $?
# else
#     echo "$admin_list not found: skipping"
# fi

declare -a admins=( root admin )

# special_list=$HOME/special.list
# declare -a special
# if [[ -f "$special_list" ]] ; then
#     IFS=$'\n' read -d '' -r -a special < <(sed -e 's/#.*$//' "$special_list")
# 
#     wait $! || return $?
# else
#     echo "$special_list not found: skipping"
# fi

declare -a special=(

# Adams class
"Student01"
"Student02"
"Student03"
"Student04"

# Mariannes class:
"Student05"
"Student06"
"Student07"
"Student08"

)

# Root and Admin should be wide open

if [[ " ${admins[@]} " =~ " $user " ]] ; then

    echo Admin

    # networksetup -setdnsservers Wi-Fi 8.8.8.8
    # networksetup -setdnsservers Ethernet 8.8.8.8

elif [[ " ${special[@]} " =~ " $user " ]] ; then

    # Older students get an open, but filtered experience:
    # Adams class

    echo Special

    # networksetup -setdnsservers Wi-Fi 8.8.4.4
    # networksetup -setdnsservers Ethernet 8.8.4.4

else

    echo "Everyone else"
    # Everyone else gets whitelisted DNS

    # networksetup -setdnsservers Wi-Fi 208.67.222.222
    # networksetup -setdnsservers Ethernet 208.67.222.222

fi

exit 0

我希望这能有所帮助。

为什么要用反斜杠作为所有字符的前缀?只是因为我在网上找到了一个示例脚本作为开始,并且注释也是这样。这不是惯例吗?它会给您一个运行时错误:找不到命令。您实际上是如何运行该脚本的?每当有人登录时,jamf框架都会以root用户身份运行该脚本。我正在为管理员和root以外的任何人获取“其他”dns服务器。但是,我已经更正了注释,使其仅用于与\相反的用途,现在该脚本似乎正在按预期工作!很好,使用办公区:-对不起,我在办公区找不到您。简单的案例说明非常便于携带,而且不会太夸张。当然,案例说明在这个级别上是有效的。然而,如果学生人数开始增加,那么案例陈述的规模就不够大。这就是使用外部列表很有用的地方。我有时也会对过度思考一个问题感到内疚:
$ script a1 a2 root
Admin

$ script a1 a2 Student02
Special

$ script a1 a2 Student1000
Everyone else