Как получилось с помощью ./shell.sh получить ошибку но.работает shell.sh - PullRequest
1 голос
/ 26 февраля 2012

сценарий оболочки:

VAR=(aa bb cc)

for i in "${VAR[@]}"
do
        echo $i;
done

при запуске с использованием . ar_test.sh он работает.

zhangyf@zhangyf-desktop:~/test$ . ar_test.sh 
aa
bb
cc

, но при этом не работает,

zhangyf@zhangyf-desktop:~/test$ ./ar_test.sh 
./ar_test.sh: 9: Syntax error: "(" unexpected

В файле есть другие строки, поэтому строка 9 на самом деле VAR = (aa bb cc).Я знаю разницу в том, что последний разветвляется на новый процесс оболочки, в то время как первые запускают скрипт в текущей оболочке, но почему результат так сильно отличается?

Ответы [ 2 ]

8 голосов
/ 26 февраля 2012

Разница не в вилке, а в разных оболочках. . исходный файл в текущей оболочке и ./ar_test.sh запускает исполняемый файл с оболочкой по умолчанию (/ bin / sh), которая может не поддерживать массивы. Используйте shebang в качестве первой строки вашего скрипта, чтобы указать правильную оболочку:

#!/bin/bash
...other code goes here...
2 голосов
/ 26 февраля 2012

Ваша текущая оболочка, вероятно, будет bash.Если ваша линия shebang начинается /bin/sh, то VAR=(aa bb cc) не будет работать.Использование source (команда . ), the script will run in your current shell (that is, bash`).

Убедитесь, что первая строка вашего скрипта:

#!/bin/bash

Другой способ запустить скрипт вновая оболочка bash ar_test.sh.

В ответ на бурное обсуждение в комментариях: Если вы хотите сохранить ваш скрипт переносимым в системах, где bash может не быть установлен в его стандартном расположении, вы должны поставить #!/usr/bin/env bashвместо первой строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...