С отступом табуляции, если оператор не выполняется в командной строке, но работает в сценарии bash - PullRequest
0 голосов
/ 31 января 2020

Я пишу свои скрипты в текстовом редакторе, используя вкладки для отступа, так как легче набрать 1 Tab, чем 4 Space. Однако я просто сводил себя с ума, пытаясь выяснить, почему приведенный ниже оператор if, который работает в моем скрипте bash, не работает в командной строке:

dirs=(HIC11490 HIC11493 HIC11494)
for i in "${dirs[@]}"; do
    if [ -d "$i" ]; then 
        echo $i exists; 
    else 
        echo $i does not exist;
    fi
done

В частности, в нем перечислены все файлов в рабочем каталоге:

$ nums=(HIC11490 HIC11493 HIC11494)
$ for i in "${nums[@]}"; do
> if [ -d "$i" ]; then
>
Display all 13526 possibilities? (y or n)
14295291/                                    HIC3958/
AG25/                                        HIC3959/
AG36/                                        HIC3969/
AG48_Aleksei/                                HIC397/
BGS-11/                                      HIC3970/
BSCC/                                        HIC3971/
  .                                            .
  .                                            .
  .                                            .
DNA128/                                      HIC4465/
DNA129/                                      HIC4466/
> ot exist;
> fi
> done
-bash: ot: command not found
-bash: ot: command not found
-bash: ot: command not found

Оказывается, проблемы были с вкладками, и код работает из командной строки, если они заменяются пробелами.

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

Ответы [ 2 ]

2 голосов
/ 31 января 2020

Чтобы ответить на вторую часть вашего вопроса (поскольку KamilCuk уже ответил на первый), другие символы, о которых вам следует знать, это # и !.

В сценариях ( неинтерактивные оболочки), # вводит комментарий, в то время как в интерактивной оболочке вы можете настроить, так ли это, или же га sh следует рассматривать как действительный символ в начале команда. Это контролируется параметром interactive_comments shopt.

В интерактивных оболочках ! вводит подстановку истории (т. Е. !$ заменяется последним аргументом самой последней команды ). Эта замена не происходит в скрипте bash.

2 голосов
/ 31 января 2020

Отправка от tab до bash запускает автозаполнение. Два tab символа запускают показ всех возможных завершений. Bash видит, что вы начали вводить for i in "${nums[@]}"; do, а затем два tab вызывают автозаполнение. В этом случае, поскольку не найдено ни одного совпадения с зарегистрированным завершением, большинство сценариев автозаполнения перечисляют все файлы в текущем каталоге. Если список длиннее некоторой длины, отображается вопрос Display all 13526 possibilities?. Затем символы читаются из ввода, чтобы ответить на часть Display all 13526 possibilities? (y or n) (ie. echo будет передан как ответ на этот вопрос ...), и сценарий развалится.

Это все настраивается. Bash использует GNU readline библиотека для чтения того, что вы печатаете, и библиотека обрабатывает (части) автозаполнения.

...