#bash #shell
#bash #оболочка
Вопрос:
Я написал небольшой Bash-скрипт под названием cs210_list.sh и это выдает мне следующие ошибки, когда я запускаю его либо как bash cs210_list.sh или как sh cs210_list.sh в Linux:
cs210_list.sh : строка 2: [0: команда не найдена
cs210_list.sh : строка 21: синтаксическая ошибка возле неожиданного токена `fi’
cs210_list.sh : строка 21: `fi’
это мой самый первый bash-скрипт в истории. Я не могу понять, почему я получаю ошибки. Кстати, «(строка 21)» на самом деле нет в моем коде, это просто для вашей справки.
$? -eq 0 Предполагается, что эта команда определяет, есть ли в качестве аргумента
#!/bin/bash
if [$? -eq 0];
then
echo "Error: Missing argument";
exit 1
fi
if [-e "$1"];
then
if [-d "$1"];
then
for i in $(ls)
do
if [-d "$i"];
then
echo "File: $i"
echo ""
else
echo "File: $i"
echo " Size: " $(stat -c%s $i)
fi
fi (line 21)
else
echo "$Error: File doesn't exist"
fi
done
Комментарии:
1. Вам нужен пробел после
[
2. Хорошее место для начала, когда вы сталкиваетесь с проблемами с вашим скриптом оболочки, shellcheck.net . Просто вставьте свой скрипт, и он исправит проблемы.
3. Я думаю,
$?
это не то, что вы предполагали, вам нужно$#
получить количество аргументов CLI, в то время как$?
возвращает код выхода (0, если последняя команда выполнена успешно)4.
[
не является метасимволом в bash. Поэтому bash обрабатывает токен[$?
как один токен. Затем выполняется расширение параметра$?
, который заменяется на0
. Поэтому вашим последним словом становится[0
, которое он пытается найти в$PATH
, но не находит. Если вы поставите пробел между[
и$?
, то пробел, будучи метасимволом, разделит 2 и будет представлять то, что вы намеревались.5. В качестве отступа (относительно строки
fi (line 21)
) обратите внимание, что в Bash комментарии могут быть добавлены путем добавления#
символа. Например.:fi # line 21