Как исправить ошибки скрипта Bash

#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