意外标记“then”附近出现语法错误

意外标记“then”附近出现语法错误

我尝试更改代码中的一些内容,但仍然不起作用: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)严格来说并不是一个错误,但应该修复以与代码的其余部分保持一致。

您还使用-eqThrough 进行字符串比较。要比较字符串,请使用=-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任何其他以 开头的字符串RR*|H*)将匹配以RorH等​​开头的任何字符串。

相关内容