синтаксическая ошибка возле неожиданного токена `then '

Это работает, потому что D: является допустимым именем каталога в Linux (и POSIX в целом). Для Linux это не имеет никакого значения.

(Некоторые программы будут обрабатывать определенные каталоги с такими именами по-особому, в соответствующем каталоге; например, Wine ожидает такие каталоги в каталоге dosdevices внутри префикса Wine. Но это характерно для Wine, а не что-то, навязываемое Linux.)

0
03.06.2017, 02:09
1 ответ

Не хватает пробелов.

  • 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 и т. д.

5
28.01.2020, 02:19

Теги

Похожие вопросы