Я получаю «синтаксическую ошибку рядом с неожиданным токеном `'$#''» в простом сценарии Bash.

Удобство руководств, установленных в вашей системе, заключается в том, что они описывают то, что установлено в системе.

Если базовым системным компилятором является компилятор C C89 или C99, то это будет отражено в установленных руководствах по функциям стандартной библиотеки C.

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

См. раздел SEARCH PATH FOR MANUAL PAGESв руководстве man, чтобы узнать, как изменить путь поиска для справочных страниц, а затем выяснить, где установлены новые руководства. (это зависит от того, как вы установили компилятор и связанные вещи ).

4
13.09.2019, 13:25
3 ответа

[— это команда, так что проблема в том, как вы пытаетесь использовать несколько условий. Вы хотите это:

if [ "$#" -eq 1 ] && [ -f "$1" ]; then
11
27.01.2020, 20:44

Здесь есть две проблемы. Во-первых, простая встроенная команда [не может содержать &&. Если вы хотите объединить несколько условий, вам нужно несколько[:

if [ "$#" -eq 1 ] && [ -f "$1" ]; then

Во-вторых, вы не можете использовать одинарные кавычки вокруг $#, так как это необходимо расширить. Ваша версия с '$#' -eq 1сравнивала строку $#с числом 1.

Все становится намного проще, если вы используете ключевое слово bash [[вместо этого:

if [[  "$#" -eq 1  &&  -f "$1"  ]]; then
20
27.01.2020, 20:44

Несмотря на то, что в других ответах объяснялось, как исправить скрипт, я задался вопросом, в чем технически заключается ошибка. Я думаю, что единственный допустимый синтаксис, в котором bash позволяет слову в команде быть без кавычек и без экранирования (, - это определение функций. Итак, bash увидел (и сразу подумал, что это должно быть определение функции с именем [, но затем вы добавили '$#', а bash ожидал только ), вот почему вы получили эту синтаксическую ошибку. Если это не должно было быть определением функции, то кто знает, для чего оно предназначалось. Все остальное после (, кроме ), вызвало бы ту же синтаксическую ошибку:

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

Если удалить то, что следует за (, что не соответствует синтаксису определения функции, вы получите:

$ [ ( ) ( -f "$1" )

Что заканчивается определением функции[:

$ [
bash: -f: command not found
10
27.01.2020, 20:44

Теги

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