我尝试更改代码中的一些内容,但仍然不起作用:S
#!/bin/bash
function auto_net() {
welcome
}
function welcome() {
echo "Will your net include a server?"
read choice
if [ $choice -eq "Yes" ]; then
interface Server;
elif [ $choice -eq "No" ];
then
interface Default;
fi
}
function user_input() {
declare -a devices=("${!1}")
for((i=1; i <= $2; ++i)); do
device=$3
device="$device$i"
devices+=("$device")
done
for i in ${devices[@]}; do
echo $i
done
}
function interface() {
if[ "$1" -eq "Server" ];
then
set_up Server;
set_up Router;
set_up Switch;
set_up Host;
elif[ "$1" -eq "Default" ]; then
set_up Router;
set_up Switch;
set_up Host;
fi
}
function set_up (){
local routers=()
local hosts=()
local switches=()
if [ "$1" -eq "Router" ];
then
echo "How many routers are you going to configure?"
read router_number
user_input routers[@] router_number R
elif [ "$1" -eq "Switch" ];
then
echo "How many switches are there?"
read switch_number
user_input switches[@] switch_number S
elif [ $1 -eq "Host" ];
then
echo "How many hosts per switch? Type it in order"
read host_number
user_input hosts[@] host_number H
fi
}
auto_net
echo $?
答案1
你缺少一些空格。
if[ "$1" -eq "Server" ];
elif[ "$1" -eq "Default" ]; then
if
这些应该是关键字and之后的空格elif
。
for((i=1; i <= $2; ++i)); do
这(后面缺少空格for
)严格来说并不是一个错误,但应该修复以与代码的其余部分保持一致。
您还使用-eq
Through 进行字符串比较。要比较字符串,请使用=
(-eq
比较整数):
if [ $choice = "Yes" ]; then
我也不确定你想要这个做什么:
user_input routers[@] router_number R
你可能想要
routers=( $(user_input "$router_number" R) )
或类似的东西(并修改你的user_input
函数以匹配它)。
您还应该双引号变量扩展。看 ”忘记在 bash/POSIX shell 中引用变量的安全隐患”至于为什么。
将脚本粘贴到 ShellCheck 中以获得可能问题的更完整列表:https://www.shellcheck.net/
作为一般提示,您可能希望在开发脚本时测试运行脚本,以确保刚刚编写的内容确实有效。与在测试之前编写完整的脚本相反。
避免冗长if
- then
-elif
位的另一个技巧是使用case ... esac
:
case "$1" in
Router)
echo 'How many routers?'
read router_number
# etc.
;;
Switch)
# stuff for switches
;;
Host)
# stuff for hosts
;;
*)
echo 'Something is wrong' >&1
exit 1
;;
esac
这也允许轻松的模式匹配。 R*)
在“case label”中将匹配Router
任何其他以 开头的字符串R
。R*|H*)
将匹配以R
orH
等开头的任何字符串。