Это работает, потому что D:
является допустимым именем каталога в Linux (и POSIX в целом). Для Linux это не имеет никакого значения.
(Некоторые программы будут обрабатывать определенные каталоги с такими именами по-особому, в соответствующем каталоге; например, Wine ожидает такие каталоги в каталоге dosdevices
внутри префикса Wine. Но это характерно для Wine, а не что-то, навязываемое Linux.)
Не хватает пробелов.
if[ "$1" -eq "Сервер" ];
elif[ "$1" -eq "По умолчанию" ]; затем
Это должен быть пробел после ключевых слов if
и elif
.
for((i=1; i <= $2; ++i)); do
Это (отсутствует пробел после для
) не является строго ошибкой, но должно быть исправлено для согласованности с остальной частью кода.
Вы также используете -eq
для сравнения строк. Чтобы сравнить строки, используйте =
(-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
Это также позволяет легко сопоставлять шаблоны. R*)
в «метке case» будет соответствовать Router
и любой другой строке, начинающейся с R
. R*|H*)
будет соответствовать любой строке, начинающейся с R
или H
и т. д.