Bin bash c line 0 syntax error near unexpected token

I am trying to execute sudo -su db2inst1 /opt/ibm/db2/V9.7/bin/db2 force application (1995) but I get this error: bash: syntax error near unexpected token `(' However, sudo -su db2inst1 id give...

NOTE: While this answer seems to have been correct at the time [sudo was changed later that same year to add extra escaping around characters in the arguments with -i and -s], it is not correct for modern versions of sudo, which escape all special characters when constructing the command line to be passed to $SHELL -c. Always be careful and make sure you know what passing a command to your particular version of sudo will do, and consider carefully whether the -s option is really needed for your command and/or, if it would, if you’d be better served with sudo sh -c.


Since you’ve got both the shell that you’re typing into and the shell that sudo -s runs, you need to quote or escape twice. Any of the following three would have worked with this now-ancient version of sudo:

sudo -su db2inst1 '/opt/ibm/db2/V9.7/bin/db2 "force application (1995)"'
sudo -su db2inst1 '/opt/ibm/db2/V9.7/bin/db2 force application (1995)'
sudo -su db2inst1 /opt/ibm/db2/V9.7/bin/db2 force\ application\ \(1995\)

Out of curiosity, why do you need -s? Can’t you just do the following?

sudo -u db2inst1 /opt/ibm/db2/V9.7/bin/db2 'force application (1995)'
sudo -u db2inst1 /opt/ibm/db2/V9.7/bin/db2 force application (1995)

Have you ever seen the message “syntax error near unexpected token” while running one of your Bash scripts?

In this guide I will show you why this error occurs and how to fix it.

Why the Bash unexpected token syntax error occurs?

As the error suggests this is a Bash syntax error, in other words it reports bad syntax somewhere in your script or command. There are many things that can go wrong in a Bash script and cause this error. Some common causes are missing spaces next to commands and lack of escaping for characters that have a special meaning for the Bash shell.

Finding the syntax error reported when you execute your script is not always easy. This process often requires you to change and retest your script multiple times.

To make your life easier I have analysed different scenarios in which this syntax error can occur. For every scenario I will show you the script or command with the error and the fix you need to apply to solve the problem.

Let’s get started!

One Approach to Fix Them All

Considering that this syntax error can occur in multiple scenarios you might not be able to find your exact error in the list below.

Don’t worry about it, what matters is for you to learn the right approach to identify what’s causing the error and knowing how to fix it.

And going through the examples below you will learn how to do that.

In some of the examples I will show you how to fix this error if it happens while executing a single command in a Bash shell.

In other examples we will look at Bash scripts that when executed fail with the “unexpected token” error.

To fix the error in a single command it’s usually enough to add or remove some incorrect characters that cause the syntax error in the command.

Knowing how to fix the error in a script can take a bit more time, and for that I will use the following 5-step process:

  1. Run the script that contains the syntax error.
  2. Take note of the line mentioned by the Bash error.
  3. Execute the line with the error in a Bash shell to find the error fast (without having to change the script and rerun it multiple times).
  4. Update your script with the correct line of code.
  5. Confirm the script works.

Makes sense?

It’s time for the first scenario.

Let’s say I have the following file on my Linux system:

-rw-r--r--  1 ec2-user ec2-user   28 Jun 28 22:29 report(july).csv

And I want to rename it to report_july.csv.

I can use the following command, right?

mv report(july).csv report_july.csv

When I run it I get the following error:

-bash: syntax error near unexpected token `('

But, why?

Because parentheses () are used in Bash to create a subshell. In other words they are special characters.

And Bash special character need to be escaped if used as normal characters in a command. The backslah is used to escape characters.

I will update the command to include the backslash before both parentheses:

mv report(july).csv report_july.csv

No errors this time:

-rw-r--r--   1 ec2-user ec2-user   28 Jun 28 22:29 report_july.csv

Lesson 1: Remember to escape Bash special characters when you use them as normal characters (literals) in a filename or string in general.

First error fixed!

Syntax Error Near Unexpected Token Then (Example 1)

And here is the second scenario.

When I run the following script:

#!/bin/bash

DAY="Monday"

if[ $DAY == "Monday" ]; then
  echo "Today is Monday"
else
  echo "Today is not Monday"
fi

I get back the error below:

(localhost)$ ./unexpected_token.sh
./unexpected_token.sh: line 5: syntax error near unexpected token `then'
./unexpected_token.sh: line 5: `if[ $DAY == "Monday" ]; then'

Can you see why?

The error is caused by the missing space between if and the open square bracket ( [ ).

And the reason is the following:

if is a shell builtin command and you might be thinking you are using if here. But in reality the shell sees if[ that is not a known command to the shell.

At that point the shell doesn’t know how to handle then given that it hasn’t found if before, and it stops the script with the error above.

The correct script is:

#!/bin/bash

DAY="Monday"

if [ $DAY == "Monday" ]; then
  echo "Today is Monday"
else
  echo "Today is not Monday"
fi

I have just added a space between if and [ so the shell can see the if command.

And the output of the script is correct:

(localhost)$ ./unexpected_token.sh
Today is Monday

Lesson 2: Spaces are important in Bash to help the shell identify every command.

Syntax Error Near Unexpected Token Then (Example 2)

While writing Bash scripts, especially at the beginning, it’s common to do errors like the one below:

(localhost)$ for i in {0..10} ; do echo $i ; then echo "Printing next number" ; done

When you run this one-liner here’s what you get:

-bash: syntax error near unexpected token `then'

Let’s find out why…

The syntax of a for loop in Bash is:

for VARIABLE in {0..10}
do
  echo command1
  echo command2
  echo commandN
done

And using a single line:

for VARIABLE in {0..10}; do echo command1; echo command2; echo commandN; done

So, as you can see the semicolon is used in Bash to separate commands when you want to write them on a single line.

The reason why the semicolons were not required in the first version of the script is that the newline is a command separator too.

Now, let’s go back to our error…

The one-liner that was failing with an error contains the then statement that as you can see is not part of the structure of a for loop.

The error is telling us:

  • There is a syntax error.
  • The token ‘then‘ is unexpected.

Let’s confirm the one-liner runs well after removing then:

(localhost)$ for i in {0..10} ; do echo $i ; echo "Printing next number" ; done
0
Printing next number
1
Printing next number
2
Printing next number
3
Printing next number
4
Printing next number
5
Printing next number
6
Printing next number
7
Printing next number
8
Printing next number
9
Printing next number
10
Printing next number

All good!

Lesson 3: When you see a syntax error verify that you are using Bash loops or conditional constructs in the right way and you are not adding any statements that shouldn’t be there.

Syntax Error Near Unexpected Token Done

I have created a simple script in which an if statement is nested inside a while loop. It’s a very common thing to do in Bash.

#!/bin/bash

COUNTER=0
  
while true 
do
  if [ $COUNTER -eq 0 ]; then
    echo "Stopping the script..."
    exit 1
  done
fi

This script might seem ok, but when I run it I get the following…

./unexpected_token.sh: line 8: syntax error near unexpected token `done'
./unexpected_token.sh: line 8: `  done'

Why?

The done and fi statements are correctly used to close the while loop and the if conditional statement. But they are used in the wrong order!

The if statement is nested into the while loop so we should be closing the if statement first, using fi. And after that we can close the while loop using done.

Let’s try the script:

(localhost)$ ./unexpected_token.sh 
Stopping the script...

All good now.

Lesson 4: Nested loops and conditional statements need to be closed in the same order in which they are opened.

Syntax Error Near Unexpected Token fi

Let’s look at another scenario in which this syntax error can occur with the fi token:

#!/bin/bash
  
for NAME in 'John' 'Mark' 'Kate'
do
    if [ "$NAME" == 'Mark' ] then
        echo 'Hello Mark!'
    fi
done

And this is what I get when I run it:

./unexpected_token.sh: line 7: syntax error near unexpected token `fi'
./unexpected_token.sh: line 7: `    fi'

In this case the Bash shell identifies the if statement and because of that it expects then after it.

As you can see then is there, so what’s the problem?

There is no command separator between the [ ] command (yes….it’s a command) and the then statement.

So, what’s the fix?

Add a command separator immediately after the closing square bracket. We will use the semicolon ( ; ) as command separator.

Our script becomes:

#!/bin/bash
  
for NAME in 'John' 'Mark' 'Kate'
do
    if [ "$NAME" == 'Mark' ]; then
        echo 'Hello Mark!'
    fi
done

And if I run it I get the correct output:

(localhost)$ ./unexpected_token.sh 
Hello Mark!

Lesson 5: Remember to specify command separators in your Bash scripts. Either the semicolon or the newline.

Conclusion

You now have what you need to understand what causes this syntax error in your scripts. You can apply the 5 lessons I have explained in this guide to find a fix.

Take the time to review the lessons at the end of each section so they become part of your Bash knowledge.

If you have any questions please feel free to write them in the comments below.

Now, let’s say you have saved your Bash script using Windows.

And when you run it in Linux you are seeing a syntax error that you can’t really explain because the script looks correct to you.

You might be having the problem explained in this article.

Enjoy your scripting!


Related FREE Course: Decipher Bash Scripting

Related posts:

I’m a Tech Lead, Software Engineer and Programming Coach. I want to help you in your journey to become a Super Developer!

Кодирование в терминале Linux Bash стало преобладающей практикой в ​​секторе кодирования. Инженеры-программисты и студенты, изучающие язык программирования, сталкиваются с различными ошибками. Если вы неоднократно сталкивались с такими ошибками, как Синтаксическая ошибка рядом с неожиданным токеном ‘(‘ или Синтаксическая ошибка Bash рядом с неожиданным токеном, вы можете попробовать использовать методы, описанные в статье, и стать опытным программистом. Прочитайте методы, описанные в статье, в разделе порядок описан и исправьте ошибки в командных строках вашего файла.

Linux Bash — интерпретатор командной строки для системы на базе Linux, заменяющий Bourne Shell или sh. Файлы именуются в формате .sh в сценариях Linux Bash. Если в коде сценария оболочки есть проблемы с форматированием, вы можете столкнуться с синтаксической ошибкой. Если ошибка близка к символу (, оболочка подскажет вам ошибку в строке и отобразит ошибку в соответствующей строке. Поскольку Linux Bash является интерпретатором, строка с ошибкой будет возвращена вам в Терминал, и он прекратит сканирование остальных команд в сценарии. Следовательно, вам необходимо исправить ошибку в конкретной командной строке и перейти к следующей, чтобы исправить непредвиденную ошибку токена в сценарии оболочки. Причины синтаксиса ошибка рядом с неожиданным токеном в Linux Bash перечислены ниже в этом разделе, как показано ниже:

  • Кодирование с помощью escape-последовательностей. Если вы написали код в сценарии Bash, 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, введя команду cat –v example.sh в Терминале.

Примечание 1. Файл example.sh используется в пояснительных целях, и вам необходимо ввести имя файла с непредвиденной ошибкой токена.

Примечание 2. Команда cat –v используется для отображения всех невидимых символов, которые могут представлять собой возврат каретки или пробел без разрыва.

Вариант 2: Через команду VX

Если вы не можете использовать команду cat, вы можете попробовать использовать команду vx для просмотра и изменения команд в файле, используя шаг, указанный ниже. Введите команду sh –vx ./example.sh в Терминале, чтобы открыть файл.

Вариант 3: Через od –a Command

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= «Первая командная строка «(файл примера)» в скрипте»

Примечание. Двойные кавычки необходимы для команд типа параметра, таких как str= “[(1,2),(3,4)]».

Вариант 2: добавить $ к строковым строкам

Если вы добавили строковые значения в скрипт, вам нужно добавить $ к строковым значениям, чтобы исправить синтаксическую ошибку в скрипте. Добавьте $ для командных строк со строковыми значениями, чтобы исправить непредвиденную ошибку. Здесь, в файле примера, измените командную строку как;

str= $ ‘First command line of ‘(example file)’ in the script’

Примечание. Если вы используете $ в строковом значении, вы можете обойти escape-последовательность обратной косой черты, поскольку командные строки декодируются по стандарту ANSI C. Другими словами, используя $ для строкового значения, вы можете избежать использования двойных кавычек вместо одинарных в командных строках.

Вариант 3: преобразовать вкладки в пробелы

Пробелы, которые вы оставили между двумя операторами в команде, должны быть пробелами, а не табуляцией, чтобы исправить синтаксическую ошибку в сценарии. Если вы получаете ошибку на Cygwin, вы можете попробовать преобразовать вкладки в кодах в пробелы, чтобы исправить ошибку. Командная строка представлена ​​ниже как;

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

Приведенную выше команду следует переписать, как показано ниже, чтобы исправить ошибку.

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

Вариант 4. Используйте escape-символы

Если вы используете символ bash, важно использовать escape-символ вместе с символом bash, чтобы исправить синтаксическую ошибку. Круглые скобки или () являются специальными символами bash в файле, поэтому вам нужно будет использовать escape-символ или обратную косую черту в командной строке, чтобы экранировать обычные символы для выполнения команды. Команда str= ‘Первая командная строка ‘(пример файла)’ в команде script’ не выдаст ошибку в Терминале, поскольку используется escape-символ.

Вариант 5. Используйте пробелы между символами

Сценарий оболочки распознает команды и операторы в сценарии по значениям по умолчанию. Вам необходимо обеспечить правильное использование пробелов между символами, чтобы оболочка могла идентифицировать команду, указанную в сценарии. Пробел — это символ, который используется для различения двух символов в командной строке. В коде нет пробела между if и [, which gives the unexpected token error as the if[ command is not identified by the shell. If the code is changed to if [ $ day == “mon” ]; тогда ошибка может быть решена с помощью команды бюллетеня оболочки, если она идентифицируется оболочкой.

Вариант 6. Используйте разделитель команд для операторов

Различные команды в сценарии оболочки должны быть разделены на операторы, чтобы Терминал мог идентифицировать отдельные команды. Вам нужно использовать разделитель команд, чтобы исправить синтаксическую ошибку в Linux Bash. Операторы в команде должны быть разделены разделителем команд, таким как точка с запятой или ; или новую строку, нажав клавишу Enter. Например, команда в коде if [ $ day == “mon” ] тогда нужно изменить, как если бы [ $ day == “mon” ]; затем исправить ошибку. Поскольку точка с запятой используется в качестве разделителя команд между символами [ and then, you can fix this error.

Option 7: Remove Additional Statements

Sometimes, you may have added additional statements or may have mixed up the codes in case of multiple nested loops. You need to remove the additional statements on the command lines to fix the Syntax error near unexpected token ‘(’ in the Linux Bash. The bash loops for…done or and the constructional constructs if… fi needs to be in the correct syntax. The example file has the wrong syntax in the for loop has the term then which is used in the if statement. Modifying the code as the following code will fix the unexpected token error. The statement then is an additional statement in the code and removing the term will fix the error.

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

Option 8: Ensure Order of Closing of Statements is Correct

If you are using many nested or conditional construct statements in the shell script, you have to ensure that the loops are closed in the order they are opened. You can use a new line separator to avoid conflicts with the loops. The order of closing the nested loops and conditional statements should be correct and must not be altered. The loops in the code while true; do if [ $ day == “mon” ]; затем эхо «мон»; иначе эхо «не пн»; Выполнено; fi нужно закрывать в правильном порядке. Изменение кода, как показано ниже, может исправить непредвиденную ошибку токена, поскольку порядок закрытия операторов исправлен.

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

Способ 2: переписать код

Если вы скопировали код и вставили его в новый файл в Терминале, вы можете попробовать переписать код вручную, чтобы исправить ошибку. Ошибки в коде можно исправить, если вы написали код без каких-либо ошибок формата в сценарии оболочки. Это связано с тем, что скрытые символы и проблемы с форматированием в текстовом редакторе, таком как Microsoft Word, которые вы могли использовать для копирования и вставки кода, могли привести к ошибке.

Способ 3: используйте команду Dos2unix.exe

Если вы используете операционную систему Unix, вы можете писать коды с символом перевода строки как n, чтобы перейти к следующей строке в файле. Однако, если вы используете ОС Windows, вам нужно перейти к следующей строке в коде, используя возврат каретки и перевод строки или rn в файле. Если вы выполняете код, написанный в ОС Windows, в Cygwin, вы можете получить синтаксическую ошибку рядом с неожиданным токеном ‘(‘.

Чтобы исправить ошибку, вам нужно очистить символы возврата каретки, используя инструмент командной строки DOS в Unix в качестве конвертера формата текстового файла. Введите следующую команду как dos2unix.exe example.sh в терминале, и вы сможете преобразовать файл в формат Unix.

***

В статье обсуждались основные методы исправления синтаксической ошибки Bash рядом с неожиданным токеном ‘(‘ в сценарии. Если вы используете Linux Bash, вы можете использовать методы, описанные в этом разделе, для исправления синтаксической ошибки Bash рядом с неожиданным токеном. Если вы Если вы прочитали всю статью и нашли ее содержание полезным, сообщите нам о своих предложениях и вопросах в разделе комментариев.

Looking inside /etc/init.d/functions on an old CentOS system, the daemon function effectively runs

/bin/bash -c "[...] ; $*"

$* expands to to the function’s arguments, separated by spaces, effectively losing the extra quotes around «udp…localhost)». The result is given to a new shell, that sees the following:

/root/amr/bin/pcdaemon --daemon -i ens192 -f udp && portrange 3000-8000 && not(src host localhost)

and runs it as a command line. The && is not quoted at this point, so it’s interpreted by the shell where foo && bar means «run foo, then if it succeeds, run bar». As it happens the not(src... triggers a syntax error so nothing runs. Changing the not to a ! will not help, because even though it removes the syntax error, the shell now runs pcdaemon with the arguments truncated and then tries to run a program called portrange.

Apart from having Red Hat fix the script, you could work around this by putting the pcdaemon command line in a script of its own (as suggested by
Mark Plotnick), or by adding another set of quotes. With the current daemon function, I think this should work:

daemon /root/amr/bin/pcdaemon --daemon -i ens192 -f "'udp && portrange 3000-8000 && not(src host localhost)'" 

(Though if someone were to actually fix the daemon function, then this would give the extra quotes to pcdaemon.)

I am trying to download flareget download manager via wget
I get error

wget  http://www.flareget.com/files/flareget/debs/amd64/flareget_2.3-24_amd64(stable)_deb.tar.gz
bash: syntax error near unexpected token `('

Why is that error coming and what is the solution for that?

asked Nov 8, 2013 at 10:27

Registered User's user avatar

Registered UserRegistered User

4,7349 gold badges35 silver badges43 bronze badges

1

You should use single quotes ' or double quotes " around the URL in this case (and in general):

wget  'http://www.flareget.com/files/flareget/debs/amd64/flareget_2.3-24_amd64(stable)_deb.tar.gz'

From now, you should use this method in general when you use a string which contain parentheses as argument in a command. That is because parentheses are used for grouping by the shell such that they are not communicated in any way to a command. So, the bash shell will give you a syntax error:

$ echo some (parentheses)
bash: syntax error near unexpected token `('
$ echo 'some (parentheses)'
some (parentheses)

answered Nov 8, 2013 at 10:30

Radu Rădeanu's user avatar

Radu RădeanuRadu Rădeanu

164k47 gold badges321 silver badges397 bronze badges

1

It’s because of the brackets. You need to escape them like this:

wget  http://www.flareget.com/files/flareget/debs/amd64/flareget_2.3-24_amd64(stable)_deb.tar.gz

Now it should work.

answered Nov 8, 2013 at 10:29

chaos's user avatar

2

Mine had nothing to do with un-escaped brackets and everything to do with an alias already being defined with the same name as the function.

Alias in one file:

alias foo="echo do something"

Function in another:

foo() {
    # Do something else
}

Both of these files were sourced by my ~/.bashrc, giving me the unhelpful error message:

syntax error near unexpected token (

Zanna's user avatar

Zanna

68.2k55 gold badges210 silver badges320 bronze badges

answered Nov 29, 2021 at 2:09

Andy J's user avatar

Andy JAndy J

1,0181 gold badge12 silver badges17 bronze badges

1

  1. Fix Syntax and Formatted Strings to Solve bash: syntax error near unexpected token Error in Bash
  2. Use the dos2unix Command to Solve bash: syntax error near unexpected token Error in Bash

Solve Syntax Error Near Unexpected Token in Bash

Writing code with Bash scripting, escape sequences or quotation marks may cause errors. This article will explain how to solve the bash: syntax error near unexpected token error in Linux Bash.

There are many code-related reasons for getting a syntax error near unexpected token in Bash scripting. We will explain the most common mistakes and ways to fix them.

Fix Syntax and Formatted Strings to Solve bash: syntax error near unexpected token Error in Bash

If you are getting this error, you most likely made a syntax error. First, read the file’s contents with the cat command.

Note the use of single-quote and double-quote characters.

If you are using escape characters, you must use double quotes. Single quotes do not allow these characters.

For example, the following code will throw the syntax error near unexpected token '(' error.

#!/bin/bash
str='You '(cannot)' do this'

syntax error

However, if you write the same code with double quotes, you can use escape characters. The code below will work without errors.

#!/bin/bash
str="You "(can)" do this"

Also, another way to do this is to add the $ at the beginning of the string. In this way, strings in the form of $'string' are treated specially.

Backslash escape sequences are decoded as specified by the ANSI C standard.

#!/bin/bash
str=$'You '(can)' do this'

Use the dos2unix Command to Solve bash: syntax error near unexpected token Error in Bash

Unix operating systems use line feed ("n") as the end of the line, but Windows operating systems use carriage return and line feed ("rn"). So if you want to execute a code written in Windows with Cygwin, you may get this error.

You must clear the carriage return characters to execute the file.

The dos2unix command-line tool is a DOS to Unix text file format converter and vice versa. You can use this tool to make your file Unix compatible.

Its usage is as follows.

The file will be converted to Unix format. You can now execute the file.

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and
privacy statement. We’ll occasionally send you account related emails.

Already on GitHub?
Sign in
to your account


Closed

Tangjiandd opened this issue

Mar 25, 2019

· 20 comments

Comments

@Tangjiandd

when I run «horovodrun -np 4 -H localhost:4 python3 train_mfh_coatt_glove.py «
then a bug «/bin/sh: -c: line 0: syntax error near unexpected token `(‘» shows

@alsrgv

@Tangjiandd, thanks for being one of the early adopters of horovodrun!

Could you re-run your command with --verbose flag and paste the output? It will help us debug the problem.

@Tangjiandd

@Tangjiandd, thanks for being one of the early adopters of horovodrun!
Could you re-run your command with —verbose flag and paste the output? It will help us debug the problem.

thanks for your replying
I have tried to use —verbose flag, but it just ouputs the bug «bash: syntax error near unexpected token `(‘».
whether it may be caused by the version of bash.

@alsrgv

Interesting. I’m wondering where is the ( coming from.

Did you add --verbose flag before the program name, like this?

root@6e7730eb4a05:/examples# horovodrun -np 4 -H localhost:4 --verbose python pytorch_mnist.py
Filtering local host names.
mpirun --allow-run-as-root --tag-output -np 4 -H localhost:4 -bind-to none -map-by slot -mca pml ob1 -mca btl ^openib   -x NCCL_DEBUG=INFO  -x NVIDIA_DRIVER_CAPABILITIES -x MXNET_URL -x PYTHON_VERSION -x NVIDIA_VISIBLE_DEVICES -x PATH -x CUDA_VERSION -x SHLVL -x CUDNN_VERSION -x LS_COLORS -x _HOROVOD_SECRET_KEY -x _ -x CUDA_PKG_VERSION -x HOME -x NVIDIA_REQUIRE_CUDA -x HOSTNAME -x TERM -x LIBRARY_PATH -x TENSORFLOW_VERSION -x NCCL_VERSION -x PWD -x PYTORCH_VERSION -x LD_LIBRARY_PATH python pytorch_mnist.py
...

What does the output of horovodrun --version -np 1 look like?

@Tangjiandd

Interesting. I’m wondering where is the ( coming from.
Did you add —verbose flag before the program name, like this?
root@6e7730eb4a05:/examples# horovodrun -np 4 -H localhost:4 —verbose python pytorch_mnist.py
Filtering local host names.
mpirun —allow-run-as-root —tag-output -np 4 -H localhost:4 -bind-to none -map-by slot -mca pml ob1 -mca btl ^openib -x NCCL_DEBUG=INFO -x NVIDIA_DRIVER_CAPABILITIES -x MXNET_URL -x PYTHON_VERSION -x NVIDIA_VISIBLE_DEVICES -x PATH -x CUDA_VERSION -x SHLVL -x CUDNN_VERSION -x LS_COLORS -x _HOROVOD_SECRET_KEY -x _ -x CUDA_PKG_VERSION -x HOME -x NVIDIA_REQUIRE_CUDA -x HOSTNAME -x TERM -x LIBRARY_PATH -x TENSORFLOW_VERSION -x NCCL_VERSION -x PWD -x PYTORCH_VERSION -x LD_LIBRARY_PATH python pytorch_mnist.py

What does the output of horovodrun —version -np 1 look like?

I am also confused by the origin of ‘(‘.
when I run «horovodrun -np 4 -H localhost:4 —verbose python3 train_mfh_coatt_glove.py», the output is ‘/bin/sh: -c:行0: 未预期的符号 `(‘ 附近有语法错误’.
The output of «horovodrun —version -np 1» is «0.16.1»

@alsrgv

Is Filtering local host names. present in the output with the --verbose flag?

@Tangjiandd

Is Filtering local host names. present in the output with the —verbose flag?

Yes, it ouputs the ‘filtering local host names’ followed by »/bin/sh: -c:行0: 未预期的符号 `(‘ 附近有语法错误’.’

@alsrgv

Is there anything else between Filtering local host names. and /bin/sh: -c:行0: 未预期的符号 (‘ 附近有语法错误’`?

@Tangjiandd

Is there anything else between Filtering local host names. and /bin/sh: -c:行0: 未预期的符号 (‘ 附近有语法错误’`?

«mpirun —allow-run-as-root —tag-output -np 4 -H localhost:4 -bind-to none -map-by slot -mca pml ob1 -mca btl ^openib -x NCCL_DEBUG=INFO -x XDG_SESSION_ID -x HOSTNAME -x SHELL -x TERM -x HISTSIZE -x SSH_CLIENT -x QTDIR -x QTINC -x SSH_TTY -x QT_GRAPHICSSYSTEM_CHECKED -x USER -x CUDA_HOME -x LD_LIBRARY_PATH -x LS_COLORS -x TERMCAP -x PATH -x MAIL -x STY -x PWD -x JAVA_HOME -x LANG -x MODULEPATH -x KDEDIRS -x LOADEDMODULES -x HISTCONTROL -x LD_LIBRARY_PATH_PRESERVED -x HOME -x SHLVL -x JDK_HOME -x LOGNAME -x QTLIB -x WINDOW -x SSH_CONNECTION -x MODULESHOME -x LESSOPEN -x XDG_RUNTIME_DIR -x QT_PLUGIN_PATH -x BASH_FUNC_module() -x OLDPWD -x _ -x _HOROVOD_SECRET_KEY python3 train_mfh_coatt_glove.py
«

@alsrgv

@Tangjiandd

@alsrgv

Added PR #949 with a potential fix. Could you try it by reinstalling horovod with [flags] pip install --no-cache-dir git+https://github.com/horovod/horovod@ignore_bash_func_module?

@Tangjiandd

@Tangjiandd

@alsrgv

@Tangjiandd

@denfromufa

The issue still has not been resolved for me from the master branch:

syntax error near unexpected token (‘`

(powerai.1.6) [benchmarks]$ horovodrun -np 4     python scripts/tf_cnn_benchmarks/tf_cnn_benchmarks.py         --model resnet101         --batch_size 64         --variable_update horovod
/bin/sh: -c: line 0: syntax error near unexpected token `('
/bin/sh: -c: line 0: `mpirun --allow-run-as-root --tag-output -np 4  -bind-to none -map-by slot -mca pml ob1 -mca btl ^openib   -x NCCL_DEBUG=INFO  -x AS -x LDFLAGS -x AR -x CUDA_PATH -x MANPATH -x XDG_SESSION_ID -x GCC_NM -x _ModuleTable003_ -x HOSTNAME -x HRTC_PATH -x HOST -x TERM -x SHELL -x NM -x HISTSIZE -x CPPFLAGS -x LMOD_DEFAULT_MODULEPATH -x LMOD_SYSTEM_DEFAULT_MODULES -x MODULEPATH_ROOT -x SSH_CLIENT -x LIBRARY_PATH -x CONDA_SHLVL -x LMOD_PACKAGE_PATH -x CONDA_PROMPT_MODIFIER -x TF_INCLUDE_DIR -x SIZE -x LMOD_PKG -x LSF_SERVERDIR -x OLDPWD -x LMOD_VERSION -x SSH_TTY -x CAFFE_BIN -x LSF_LIBDIR -x OPAL_PREFIX -x http_proxy -x USER -x LMOD_sys -x LD_LIBRARY_PATH -x LS_COLORS -x CONDA_BACKUP_HOST -x CONDA_EXE -x HRTC_NB_CORES -x CPATH -x _ModuleTable004_ -x POWERAI_caffe_CAFFE_BIN -x CXXFLAGS -x STRINGS -x LMOD_IGNORE_CACHE -x CPP -x LMOD_PREPEND_BLOCK -x CXXFILT -x HRTC_USE_SHARE -x BASELINE -x _ModuleTable001_ -x MODULE_VERSION -x MAIL -x PATH -x CPUTYPE -x DEBUG_CXXFLAGS -x LD -x CONDA_PREFIX -x LMOD_SETTARG_CMD -x PWD -x STRIP -x _LMFILES_ -x POWERAI_pytorch_OMP_NUM_THREADS -x ELFEDIT -x GCC_RANLIB -x LMOD_PAGER -x LANG -x MODULEPATH -x LOADEDMODULES -x _ModuleTable_Sz_ -x LMOD_SYSTEM_NAME -x _ModuleTable005_ -x LMOD_CMD -x https_proxy -x LMOD_AVAIL_STYLE -x HRTC_LD_LIBRARY_PATH -x LSF_BINDIR -x CXX -x HISTCONTROL -x OBJCOPY -x HRTC_DEFAULT_JOB_SCHEDULER -x SHLVL -x HOME -x TF_LIBRARY_DIR -x DEBUG_CPPFLAGS -x CFLAGS -x _ModuleTable002_ -x BINARY_TYPE_HPC -x _CONDA_PYTHON_SYSCONFIGDATA_NAME -x GCC -x BASH_ENV -x MPI_ROOT -x ADDR2LINE -x CONDA_PYTHON_EXE -x LESS -x HRTC_SYSTEM_NAME -x LMOD_arch -x LOGNAME -x VIADEV_ENABLE_AFFINITY -x SSH_CONNECTION -x MODULESHOME -x OMP_NUM_THREADS -x CONDA_DEFAULT_ENV -x LESSOPEN -x DEBUG_CFLAGS -x RANLIB -x __Init_Default_Modules -x HRTC_APPLI_DIR -x LMOD_FULL_SETTARG_SUPPORT -x CC -x XDG_RUNTIME_DIR -x READELF -x LMOD_DIR -x LSF_ENVDIR -x GCC_AR -x OBJDUMP -x LOCATION -x GPROF -x LMOD_COLORIZE -x POWERAI_caffe_OMP_NUM_THREADS -x GXX -x LMOD_INSTALLATION_DIR -x BASH_FUNC_ml() -x _ -x _HOROVOD_SECRET_KEY python scripts/tf_cnn_benchmarks/tf_cnn_benchmarks.py --model resnet101 --batch_size 64 --variable_update horovod'

@denfromufa

bash version:

bash --version
GNU bash, version 4.2.46(2)-release (powerpc64le-redhat-linux-gnu)

@alsrgv

@denfromufa, submitted #1002 with a fix. Can you try pip install --no-cache-dir git+https://github.com/horovod/horovod@expand_bash_re?

@kmaladkar

Hi, I get this following error.
Could not find a tag or branch 'expand_bash_re', assuming commit.

Is this workaround still working?

@alsrgv

@grimreaper94, the fix is now available in master. You can install it using pip install --no-cache-dir git+https://github.com/horovod/horovod

bash: syntax error near unexpected token '('

You need to escape the brackets:

mv hiscore(pre_mame0133u1).dat /mnt/three/usr/local/share/xmame/hiscore.dat

Note:

For future reference you can use ShellCheck to find bugs in your bash code. Entering the uncorrected script gives the following:

$ shellcheck myscript

Line 1:
mv hiscore(pre_mame0133u1).dat /mnt/three/usr/local/share/xmame/hiscore.dat
^-- SC2148: Tips depend on target shell and yours is unknown. Add a shebang.
          ^-- SC1036: '(' is invalid here. Did you forget to escape it?
          ^-- SC1088: Parsing stopped here. Invalid use of parentheses?

Correcting the first error:

$ shellcheck myscript

Line 1:
mv hiscore(pre_mame0133u1).dat /mnt/three/usr/local/share/xmame/hiscore.dat
^-- SC2148: Tips depend on target shell and yours is unknown. Add a shebang.
                          ^-- SC1089: Parsing stopped here. Is this keyword correctly matched up?

And correcting the second error:

$ shellcheck myscript

Line 1:
mv hiscore(pre_mame0133u1).dat /mnt/three/usr/local/share/xmame/hiscore.dat
^-- SC2148: Tips depend on target shell and yours is unknown. Add a shebang.

Further Reading

  • An A-Z Index of the Bash command line for Linux — An excellent reference for all things Bash command line related.
  • syntax-quoting — Escape Characters, delimiters and Quotes

Синтаксическая ошибка сообщения об ошибке рядом с неожиданным токеном `(‘ возникает в среде типа Unix, Cygwin и в интерфейсе командной строки в Windows. Эта ошибка, скорее всего, будет вызвана при попытке запустить сценарий оболочки, который был отредактирован или созданный в старых системах DOS / Windows или Mac.

Ошибка синтаксиса рядом с неожиданным токеном `('

Это сообщение об ошибке также появляется, когда вы вводите команды в командной строке Linux для повседневных задач, таких как копирование файлов вручную и т. Д. Основные причины появления этого сообщения об ошибке либо из-за неправильного синтаксиса, либо из-за проблемы ОС при интерпретации команд другой системы / оболочка.

Что вызывает синтаксическую ошибку рядом с неожиданным токеном `(‘?

Причины этого сообщения об ошибке очень разнообразны и не могут быть перечислены в одной статье, так как существуют тысячи возможных ошибок синтаксиса при выполнении команд. Основные причины этой ошибки:

  • Неверный синтаксис при выполнении любой команды на любой платформе. Либо вы неправильно используете команду, либо ввели неправильный синтаксис.
  • Оболочка несовместима между системами Unix / DOS.
  • Возникли проблемы с запуском сценария оболочки bash из другого источника .

В этой статье мы предполагаем, что вы знаете основы программирования и имеете представление о том, что делаете. Если вы новичок, лучше всего следовать подробным инструкциям по языку / команде, которую вы пытаетесь выполнить. Вероятно, вы ошиблись в синтаксисе.

Решение 1. Проверка синтаксиса и формата команд

Первая и основная причина, по которой вы можете получить это сообщение об ошибке, — это неправильный синтаксис в вашем коде или несоблюдение точного формата команд. Каждая команда имеет предопределенный формат, который вы можете увидеть в ее документации. Некоторые параметры являются необязательными, другие — обязательными.

Кроме того, следует уделять особое внимание дополнительному пространству , использованию двойных кавычек и обязательным параметрам. Если какие-либо из них отсутствуют или были объявлены неправильно, вы не сможете выполнить свой код.

Например, вместо следующего кода

[mycom7] # ./ctopo.sh um_test1 [(1,2), (2,1)]

Вам нужно выполнить его как

[mycom7] # ./ctopo.sh um_test1 "[(1,2), (2,1)]"

Также убедитесь, что вы правильно выполняете свои команды / сценарий оболочки, если он занимает несколько строк.

Из-за типа параметра необходимы двойные кавычки. Дополнительное пространство также может испортить ваш код и вызвать сообщение об ошибке. Убедитесь, что вы проверили официальную документацию команды, которую вы выполняете, и посмотрите, есть ли там проблема.

Решение 2. Устранение неполадок сценария оболочки

Если вы используете сценарий оболочки, который работает в исходной системе, но возвращает ошибку в целевой системе, вы можете устранить неполадки сценария, проверив переменные, которые хранятся во время выполнения, а затем посмотреть, что вызывает проблему. Это очень частая причина, поскольку в некоторых случаях оболочка пытается интерпретировать непечатаемый символ.

Попробуйте запустить оболочку с параметром vx. Это покажет нам, какие команды выполняются и какие значения хранятся в скрипте. Здесь вы можете устранять неполадки и диагностировать, что не так.

Например, выполните скрипт в терминале после включения vx как:

# sh -vx ./test_script5.sh

Вы можете проверить содержимое скрипта, используя команду cat как:

# cat test_script5.sh

Решение 3. Использование команды dos2unix.exe

В текстовых файлах Windows / DOS новая строка представляет собой комбинацию символа возврата каретки ( r), за которым следует перевод строки ( n). В Mac (до Mac OS X) для переноса строки использовался простой возврат каретки ( r). Unix / Linux и Mac OS X используют перевод строки ( n). Если вы используете Cygwin, он не сможет обработать сценарии, созданные DOS / Windows и более ранними версиями Mac из-за дополнительного символа возврата каретки ( r).

Использование команды dos2unix.exe

Здесь вы можете создать команду ‘dos2unix.exe’, которая преобразует скрипт в правильный формат, а затем вы можете выполнить его без каких-либо проблем.

В заключение вам необходимо изучить свои команды и тип используемой платформы и убедиться, что нет никаких расхождений. Поскольку мы не можем охватить все возможные варианты, у вас будет представление о том, какие ошибки могут возникнуть и как их исправить.

Понравилась статья? Поделить с друзьями:
  • Bilnittialibrary failed 0xc00000bb как исправить
  • Billing service unavailable on device как исправить ошибку
  • Billing error перевод
  • Billing error 100 что это
  • Billing address is invalid discord как исправить