Bash脚本elif未触发
我需要一些帮助来弄清楚为什么下面脚本中的elif不起作用。if的第一部分起作用,语句的else部分起作用,但elif不起作用。换句话说,当我以“root”身份登录时,我得到了我期望的DNS地址。如果我以来宾身份登录,我会得到我期望的DNS地址,但如果我以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
#!/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