Синтаксическая ошибка строки 56: неожиданный конец файла

Я набрал код для этого примера mychoice.sh bash, и я продолжаю получать синтаксическую ошибку: неожиданный конец файла.

Я что-то упустил?

mychoice. sh

#!/bin/bash E='echo -e';e='echo -en';trap ";exit" 2 ESC=$( $e "\e") TPUT(){ $e "\e[${1};${2}H";} CLEAR(){ $e "\ec";} CIVIS(){ $e "\e[25l"} DRAW(){ $e "\e%\e(0";} WRITE(){ $e "\e(B";} MARK(){ $e "\e[7m";} UNMARK(){ $e "\e[27m";} R(){ CLEAR ;stty sane;$e "\ec\e[37;44m[J";}; HEAD(){ DRAW for each in $(seq 1 13);do $E " x x" done WRITE;MARK;TPUT; 1 5 $E "BASH SELECTION MENU ";UNMARK;} i=0; CLEAR; CIVIS;NULL=/dev/null FOOT(){ MARK;TPUT 13 5 printf "ENTER - SELECT,NEXT ";UNMARK;} ARROW(){ read -s -n3 key 2>/dev/null >&2 if [[$key = $ESC[A ]];then echo up;fi if [[$key = $ESC[B ]];then echo dn;fi;} M0(){ TPUT 4 20; $e "Login info";} M1(){ TPUT 5 20; $e "Network";} M2(){ TPUT 6 20; $e "Disk";} M3(){ TPUT 7 20; $e "Routing";} M4(){ TPUT 8 20; $e "Time";} M5(){ TPUT 9 20; $e "About ";} M6(){ TPUT 10 20; $e "Exit ";} LM=6 MENU(){ for each in $(seq 0 $LM);do M${each};done;} POS(){ if [[ $cur == up ]];then ((i--));fi if [[ $cur == dn ]];then ((i++));fi if [[ $i -lt 0 ]];then i=$LM;fi if [[ $i -gt $LM ]];then i=0;fi;} REFRESH(){ after=$((i+1)); before=$((i-!)) if [[ $before -lt 0 ]];then before=$LM;fi if [[ $after -gt 0 ]];then after=0;fi if [[ $j -lt $i ]];then UNMARK;M$before;else UNMARK;M$after;fi if [[ $after -eq 0 ]] || [$before -eq $LM ];then UNMARK; M$before; M$after;fi;j=$i;UNMARK;M$before;M$after;} INIT(){ R;HEAD;FOOT;MENU;} SC(){ REFRESH;MARK;$S;$b;cur='ARROW';} ES(){ MARK;$e "ENTER = main menu ";$b;read;INIT;};INIT while [[ "$0" != " " ]]; do case $i in 0) S=M2;SC;if [[ $cur == "" ]];then R;$e "\nS(w )\n";ES;fi;; 1) S=M2;SC;if [[ $cur == "" ]];then R;$e "\nS(ifconfig )\n";ES;fi;; 2) S=M2;SC;if [[ $cur == "" ]];then R;$e "\nS(df -h )\n";ES;fi;; 3) S=M2;SC;if [[ $cur == "" ]];then R;$e "\nS(route -n )\n";ES;fi;; 4) S=M2;SC;if [[ $cur == "" ]];then R;$e "\nS(date )\n";ES;fi;; 5) S=M2;SC;if [[ $cur == "" ]];then R;$e "\nS($e by oTo )\n";ES;fi;; 6) S=M2;SC;if [[ $cur == "" ]];then R;exit 0;fi;; esac;POS;done;
-2
задан 3 December 2017 в 02:43

4 ответа

Вы можете запустить ваш скрипт с помощью проверки оболочки:

$ shellcheck myscript Line 7: CIVIS(){ $e "\e[25l"} ^-- SC1009: The mentioned parser error was in this function. ^-- SC1073: Couldn't parse this brace group. ^-- SC1083: This } is literal. Check expression (missing ;/\n?) or quote it. Line 23: if [[$key = $ESC[A ]];then echo up;fi ^-- SC1035: You need a space after the [[ and before the ]]. Line 24: if [[$key = $ESC[B ]];then echo dn;fi;} ^-- SC1035: You need a space after the [[ and before the ]]. Line 42: if [[ $after -eq 0 ]] || [$before -eq $LM ];then ^-- SC1035: You need a space after the [ and before the ]. Line 56: ^-- SC1056: Expected a '}'. If you have one, try a ; or \n in front of it. ^-- SC1072: Missing '}'. Fix any mentioned problems and try again. $

Как проверяет shell, нам нужно изменить строку 7:

CIVIS(){ $e "\e[25l"}

на:

CIVIS(){ $e "\e[25l";}
3
ответ дан 18 July 2018 в 02:00

Пара комментариев:

Не используйте переменные для вызова команд, как в E='echo -e';e='echo -en'; вместо этого используйте функции с хотя бы несколькими описательными именами. В качестве альтернативы используйте printf, если вам нужна интерпретация обратной косой черты, добавьте пробелы после команды test, [ и [[ (и да, это не оператор, на самом деле это команда под названием «тест», а [ - это просто сокращение для этого вам нужны пробелы) используйте строчные буквы для имен функций и переменных (это позволит избежать путаницы со стандартными переменными окружения) в дополнение к тому, что уже было опубликовано в WinEunuuchs2Unix, shellcheck также отмечает еще одну вещь: SC(){ REFRESH;MARK;$S;$b;cur='ARROW';} ^-- SC2154: b is referenced but not assigned. Эта переменная $b не назначается, поэтому рассмотрите либо избавление от него, если оно не будет использоваться или присвоить ему какую-то ценность.
1
ответ дан 18 July 2018 в 02:00

Вы можете запустить ваш скрипт с помощью проверки оболочки:

$ shellcheck myscript Line 7: CIVIS(){ $e "\e[25l"} ^-- SC1009: The mentioned parser error was in this function. ^-- SC1073: Couldn't parse this brace group. ^-- SC1083: This } is literal. Check expression (missing ;/\n?) or quote it. Line 23: if [[$key = $ESC[A ]];then echo up;fi ^-- SC1035: You need a space after the [[ and before the ]]. Line 24: if [[$key = $ESC[B ]];then echo dn;fi;} ^-- SC1035: You need a space after the [[ and before the ]]. Line 42: if [[ $after -eq 0 ]] || [$before -eq $LM ];then ^-- SC1035: You need a space after the [ and before the ]. Line 56: ^-- SC1056: Expected a '}'. If you have one, try a ; or \n in front of it. ^-- SC1072: Missing '}'. Fix any mentioned problems and try again. $

Как проверяет shell, нам нужно изменить строку 7:

CIVIS(){ $e "\e[25l"}

на:

CIVIS(){ $e "\e[25l";}
3
ответ дан 24 July 2018 в 17:30

Пара комментариев:

Не используйте переменные для вызова команд, как в E='echo -e';e='echo -en'; вместо этого используйте функции с хотя бы несколькими описательными именами. В качестве альтернативы используйте printf, если вам нужна интерпретация обратной косой черты, добавьте пробелы после команды test, [ и [[ (и да, это не оператор, на самом деле это команда под названием «тест», а [ - это просто сокращение для этого вам нужны пробелы) используйте строчные буквы для имен функций и переменных (это позволит избежать путаницы со стандартными переменными окружения) в дополнение к тому, что уже было опубликовано в WinEunuuchs2Unix, shellcheck также отмечает еще одну вещь: SC(){ REFRESH;MARK;$S;$b;cur='ARROW';} ^-- SC2154: b is referenced but not assigned. Эта переменная $b не назначается, поэтому рассмотрите либо избавление от него, если оно не будет использоваться или присвоить ему какую-то ценность.
1
ответ дан 24 July 2018 в 17:30
  • 1
    Код, который я напечатал, был из руководства по Linux, опубликованного BDM Publications. Мне интересно, как они получили $ b для работы? – Niall Magner 3 December 2017 в 18:37

Другие вопросы по тегам:

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