Кодування в терміналі 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, ці методи можуть вам допомогти. Якщо ця стаття була корисною, залишайте свої відгуки та запитання у коментарях.