Я не обязательно хочу получить ответ, но если бы кто-то мог указать мне на литературу или примеры. Я хотел бы понять это.
Когда я запускаю скрипт, я получаю сообщение об ошибке:
Синтаксическая ошибка рядом с неожиданным токеном
fi
Я пришел к выводу, что моя проблема заключается в моем if
заявлении, сделав if
комментарии к своим заявлениям и добавив, echo "$NAME"
какие имена отображаются в /etc/
.
Когда я делаю изменения, удаления #
от if
и fi
добавить #
к wc -c "$NAME"
, я получаю ошибку синтаксиса я перечислил выше. Я добавил ;
между ]
тем. Я также перешел then
на следующую строку без разрешения.
#!/bin/bash
for NAME in /etc/*
do
if [ -r "$NAME" -af "$NAME" ] then
wc -c "$NAME"
fi
done
-af
должно делать?-a
является избыточным, потому что условие уже включено в-f
. --- В любом случае несколько условий внутри[ ]
(эта команда также доступна какtest
) должны быть объединены с использованием логических операторов, таких как-a
(и) или-o
(или), но, как было предложено в ответе ниже, лучше использовать несколько команд[ ]
(test
) и присоединиться их используя операторы оболочки, такие как&&
или||
.Ответы:
Ключевые слова , как
if
,then
,else
,fi
,for
,case
и так далее должны быть в месте , где оболочка ожидает имя команды. В противном случае они рассматриваются как обычные слова. Например,просто печатает
if
, он не запускает условную инструкцию.Таким образом, в строке
слово
then
является аргументом команды[
(на которую она будет жаловаться, если она когда-либо будет запущена). Оболочка продолжает искатьthen
и находитfi
командную позицию. Поскольку онif
все еще ищет егоthen
,fi
он неожиданный, есть синтаксическая ошибка.Перед
then
этим нужно поставить терминатор команды, чтобы он распознавался как ключевое слово. Наиболее распространенный терминатор команд - это разрыв строки, но доthen
этого обычно используют точку с запятой (что имеет то же значение, что и разрыв строки).или
Как только вы исправите это, вы получите еще одну ошибку от команды,
[
потому что она не понимает-af
. Вы, вероятно, имели в видуХотя тестовые команды выглядят как опции, вы не можете связать их так. Они - операторы
[
команды, и каждый из них должен быть отдельным словом (как это делают[
и]
).Кстати, хотя
[ -r "$NAME" -a -f "$NAME" ]
работает, я рекомендую писать либоили
Лучше сохранять
[ … ]
условия простыми, потому что[
команда не может легко отличить операторы от операндов. Если$NAME
выглядит как оператор и появляется в позиции, где оператор действителен, он может быть проанализирован как оператор. Это не произойдет в простых случаях, представленных в этом ответе, но более сложные случаи могут быть рискованными. Запись этого с отдельными вызовами[
и использованием логических операторов оболочки позволяет избежать этой проблемы.Второй синтаксис использует
[[ … ]]
условную конструкцию, которая существует в bash (и ksh и zsh, но не просто sh). Эта конструкция специальный синтаксис, в то время как[
обрабатывается , как и любой другой команды, таким образом , вы можете использовать такие вещи , как&&
внутри , так и вам не нужно цитировать переменных , кроме аргументов некоторых строковых операторов (=
,==
,!=
,=~
) (см Когда двойные кавычки необходимо ? для более подробной информации).источник
if [[ 1 ]] then [[ 2 ]] fi
работает в ksh, pdksh и zsh.if(:)then(:)fi
работает во всех снарядах.Посмотрите, что изменилось следующим образом
Если вы хотите удалить все команды в блоке if, вам по крайней мере нужно добавить в него двоеточие, например
или однострочная версия
if [ -r "$NAME" -a -f "$NAME" ]; then :; fi
источник
Другие уже указали, но если вы ищете официальную ссылку, то RTM
Вы скучаете по
;
И синтаксис для
list
описан вman test
источник