予期しないマーカー「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もう1つの方法は、次を使用することです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

おすすめ記事