コードでいくつか変更してみましたが、まだ機能しません。 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*)
一致します。またはなどで始まるすべての文字列と一致します。Router
R
R*|H*)
R
H