我尝试更改代码中的一些内容,但仍然无效: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 $?
Run Code Online (Sandbox Code Playgroud)
你缺少一些空格。
if[ "$1" -eq "Server" ];elif[ "$1" -eq "Default" ]; then这些应该是关键字if和之后的空格elif。
for((i=1; i <= $2; ++i)); do 这(在 之后缺少空格for)不是严格意义上的错误,但应该修复以与其余代码保持一致。
您还-eq用于字符串比较。要比较字符串,请使用=(-eq比较整数):
if [ $choice = "Yes" ]; then
Run Code Online (Sandbox Code Playgroud)
我也不确定你想要做什么:
user_input routers[@] router_number R
Run Code Online (Sandbox Code Playgroud)
你可能想要
routers=( $(user_input "$router_number" R) )
Run Code Online (Sandbox Code Playgroud)
或类似的东西(并修改您的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
Run Code Online (Sandbox Code Playgroud)
这也允许简单的模式匹配。 R*)在“案例标签”中,将匹配Router任何其他以R. R*|H*)将匹配任何以Ror开头的字符串H,等等。