Виправити синтаксичну помилку Bash біля неочікуваного маркера

Кодування в терміналі Linux Bash є поширеною практикою в розробці програмного забезпечення. Програмісти та студенти, які вивчають мови програмування, можуть зіштовхнутися з різними помилками. Якщо ви часто бачите повідомлення про синтаксичні помилки, зокрема “синтаксична помилка біля несподіваного маркера ‘(‘”, то методи, описані нижче, можуть допомогти вам стати більш досвідченим розробником. Розгляньте їх у порядку та виправте помилки у ваших командних рядках.

Усунення синтаксичної помилки Bash біля неочікуваного маркера

Linux Bash є інтерпретатором команд для операційних систем на базі Linux, що замінює Bourne Shell (sh). Файли сценаріїв Bash мають розширення .sh. Проблеми з форматуванням у коді сценарію можуть призвести до синтаксичних помилок. Якщо помилка виникає поруч із символом “(“, інтерпретатор повідомить про це в конкретному рядку. Bash, як інтерпретатор, поверне рядок з помилкою в термінал, зупиняючи виконання подальших команд. Тому, вам потрібно буде виправити помилку в конкретному рядку і перейти до наступного, аби усунути неочікувану помилку в сценарії. Розглянемо можливі причини виникнення синтаксичної помилки біля неочікуваного маркера:

  • Проблеми з escape-послідовностями. Неправильне використання escape-послідовностей або лапок у коді може викликати помилки. Важливо використовувати правильний формат для escape-послідовностей та лапок.

  • Невірний синтаксис. Помилки в синтаксисі коду, такі як неправильний порядок циклів, можуть призвести до синтаксичних помилок.

  • Некоректне застосування команд. Неправильне використання команд, наприклад, помилки у присвоєнні значень, можуть спричинити синтаксичні помилки.

  • Несумісність ОС. Несумісність між оболонками сценаріїв кодування для систем Unix та DOS може призвести до неочікуваних помилок.

  • Помилки в сценаріях bash. Проблеми у сценаріях bash, скопійованих з інших систем, можуть також викликати неочікувані помилки маркера.

Для ілюстрації розглянемо файл example.sh, створений в сценарії Linux Bash, що містить різні командні рядки, які можуть викликати синтаксичні помилки.

str= ‘First command line of ‘(example file)’ in the script’
str= [(1,2),(3,4)]
if[ $day == “mon” ] then
 echo “mon”
else
 echo “no mon”
fi
for VARIABLE in {0..2}; then
do echo command1; echo command2; echo command3; echo command4; done
while true; do if [ $ day == “mon” ]; then echo “mon”; else echo “not mon”; done; fi

Метод 1. Ручне виправлення помилок у кожному рядку

Першим методом є ручне виправлення синтаксичної помилки в кожному рядку сценарію. У цьому розділі розглядаються кроки усунення помилок в командних рядках. Розпочнемо з запуску файлу в терміналі за допомогою команди ./example.sh і натискання Enter.

2. Зверніть увагу на рядки, де виникає помилка.

3. Виправте помилки в кожному рядку, використовуючи методи описані нижче, і збережіть файл.

4. Після внесення змін знову запустіть файл, щоб перевірити чи помилки виправлено.

Крок I: Читання вмісту файлу

Першим кроком до виправлення синтаксичних помилок є читання файлу в терміналі. Якщо є проблеми з файлом, ви можете не мати можливості його переглянути. Зазвичай файл запускають командою ./example.sh, але це не дозволить вам змінити його вміст. Далі розглянемо методи перегляду та редагування файлу.

Варіант 1: Використання команди CAT

Перший варіант – скористатися командою cat. Введіть команду cat -v example.sh у терміналі, щоб переглянути вміст файлу з неочікуваною помилкою.

Примітка 1: example.sh є прикладом. Вам потрібно ввести ім’я вашого файлу.

Примітка 2: Команда cat -v показує всі невидимі символи, включаючи пробіли, повернення каретки або пробіли без розриву.

Варіант 2: Використання команди VX

Якщо команда cat не працює, спробуйте команду vx для перегляду і редагування файлу. Введіть команду sh -vx ./example.sh у терміналі.

Варіант 3: Використання команди od -a

3. Якщо є невидимі символи, скористайтеся командою od -a для перегляду файлу. Введіть команду od -a example.sh щоб змінити код.

Крок II. Видалення розривів рядків Windows

Якщо у вашому сценарії є розриви рядків Windows, ви можете використовувати консольні команди для їх видалення та копіювання коду до нового файлу.

Введіть наступну команду в терміналі, щоб зберегти вміст файлу в correctedexample.sh, видаляючи розриви рядків Windows:

tr -d 'r' <example.sh> correctedexample.sh

Крок III: Налаштування дозволів для нового файлу

Вам потрібно надати права для редагування файлу. Введіть команду chmod 755 correctedexample.sh у терміналі, щоб надати необхідні права. Тепер ви можете редагувати виправлений файл.

Крок IV: Форматування коду

Другим кроком є форматування коду у файлі. Розглянемо різні варіанти форматування для виправлення синтаксичної помилки біля неочікуваного маркера “(“.

Варіант 1: Заміна одинарних лапок подвійними

Замініть одинарні лапки подвійними. У example.sh, код str= ‘First command line of ‘(example file)’ in the script’ потрібно змінити на str= “First command line of ‘(example file)’ in the script”.

Примітка: Подвійні лапки необхідні для команд із параметрами, як str= “[(1,2),(3,4)]”.

Варіант 2: Додавання $ до рядків

Якщо ви використовуєте рядкові значення, додайте $ перед значенням. Наприклад, змініть str= ‘First command line of ‘(example file)’ in the script’ на str= $’First command line of ‘(example file)’ in the script’.

Примітка: $ дозволяє уникнути проблем з escape-послідовностями і не використовувати подвійні лапки.

Варіант 3: Заміна табуляції на пробіли

Пробіли між операторами мають бути саме пробілами, а не табуляціями. Змініть:

do echo command1;   echo command2;        echo command3;          echo command4;       done

на:

do echo command1; echo command2; echo command3; echo command4; done

Варіант 4: Використання escape-символів

При використанні спеціальних символів bash, використовуйте escape-символ (зворотну косу риску). Наприклад, str= ‘First command line of ‘(example file)’ in the script’ має працювати без помилок, оскільки escape-символ використовується правильно.

Варіант 5: Правильне використання пробілів

Сценарій оболонки ідентифікує команди та оператори за пробілами. Наприклад, if[ $day == “mon” ] потрібно змінити на if [ $day == “mon” ], інакше виникає помилка, оскільки оболонка не ідентифікує if[ як команду.

Варіант 6: Розділення команд операторами

Команди в сценарії оболонки повинні бути розділені операторами, такими як крапка з комою (;) або перенесенням рядка. Наприклад, if [ $ day == “mon” ] then потрібно змінити на if [ $ day == “mon” ]; then, аби виправити помилку. Крапка з комою виступає роздільником між символами [ і then.

Варіант 7: Видалення зайвих операторів

Видаліть додаткові або зайві оператори у коді. Наприклад, у циклі for термін then є зайвим. Змініть:

for VARIABLE in {0..2}; then do echo command1; echo command2; echo command3; echo command4; done 

на:

for VARIABLE in {0..2}; do echo command1; echo command2; echo command3; echo command4; done

Варіант 8: Забезпечення правильного порядку закриття операторів

Переконайтеся, що цикли закриваються в правильному порядку. Наприклад: while true; do if [ $ day == “mon” ]; then echo “mon”; else echo “not mon”; done; fi потрібно змінити на:

while true; do if [ $ day == “mon” ]; then echo “mon”; else echo “not mon”; fi; done

Метод 2: Переписування коду

Якщо ви скопіювали код і вставили його у новий файл, спробуйте переписати його вручну. Це допоможе уникнути проблем з форматуванням, які могли виникнути під час копіювання з інших джерел.

Метод 3. Використання команди Dos2unix.exe

Якщо ви використовуєте Unix, для переходу на новий рядок використовується символ n. В Windows використовується rn. Якщо ви запускаєте код, написаний у Windows, в Cygwin, ви можете отримати синтаксичну помилку. Щоб це виправити, потрібно очистити символи повернення каретки за допомогою інструменту командного рядка DOS в Unix. Введіть команду dos2unix.exe example.sh у терміналі, щоб конвертувати файл у формат Unix.

***

У статті розглядалися основні методи усунення синтаксичної помилки Bash біля неочікуваного маркера ‘(‘ у сценарії. Якщо ви використовуєте Linux Bash, ці методи можуть вам допомогти. Якщо ця стаття була корисною, залишайте свої відгуки та запитання у коментарях.