예상치 못한 마커 '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키워드 및 뒤에 공백이 있어야 합니다 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 쉘에서 변수를 인용하는 것을 잊어버리는 보안 위험"왜냐면요.

가능한 문제의 전체 목록을 보려면 스크립트를 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

이는 또한 쉬운 패턴 일치를 허용합니다. "case label" 로 시작하는 다른 모든 문자열은 R*)일치됩니다 . 또는 등으로 시작하는 모든 문자열 과 일치합니다 .RouterRR*|H*)RH

관련 정보