2010-08-03 3 views
4

Я работаю с скриптом bash, который в настоящее время работает на сервере (RHEL4). Я развиваюсь на своем ноутбуке с Ubuntu 10.04, но я не думаю, что платформа вызывает проблему.Ошибка синтаксиса Bash: "[[: not found"

Вот что происходит: У меня есть сценарий скелета, который вызывает другой скрипт, который выполняет большую часть работы. Тем не менее, он вызывает вызовы getConfig.sh много. getConfig.sh в основном просто анализирует некоторый аргумент командной строки (используя getopts) и вызывает программу Java для анализа некоторых файлов XML. В любом случае getConfig.sh вызывает множество ошибок (но все же, похоже, работает).

Вот сообщение, которое я получаю

getconfig.sh: 89: [[: not found
getconfig.sh: 89: [[: not found
getconfig.sh: 94: [[: not found

я получаю эти три ошибки каждый раз, когда он работает; однако скрипт завершается и выполняется код Java.

Вот код раздела relavent

parseOptions $* 

if [[ "${debugMode}" == "true" ]] ; then 
    DEBUG="-DDEBUG=true" 
    echo "${JAVA_HOME}/bin/java ${DEBUG} -Djava.endorsed.dirs=${JAXP_HOME} -jar $(dirname $0)/GetXPath.jar ${XML_File} ${XPath_Query}" 
fi

Line 89 «parseOptions $ * и линия 94 является "фи"

Спасибо за ответы.

+0

Как в стороне, '$ *' глючит - это изменит два аргумента '«аргумент один»«аргумент два»' на четыре agruments, '«аргумент»,«один»,«аргумент» "два" '. Вместо этого используйте '' $ @ "'. –

ответ

26

Если ваш скрипт исполняемым и вы выполняете его как ./getconfig.sh, первая строка вашего скрипта должна быть:

#!/bin/bash 

Без этой строки shebang, ваш скрипт будет интерпретирован sh, который не понимает [[ в if заявлениях.

В противном случае вы должны запустить свой скрипт как bash getconfig.sh, неsh getconfig.sh. Даже если ваша оболочка по умолчанию - bash, сценарии, запущенные с sh, будут использовать уменьшенный набор функций bash, чтобы быть более совместимыми с стандартом POSIX. [[ - одна из функций, которые отключены.

+1

Спасибо Деннис. Dufus, который изначально написал этот код, использовал #!/Bin/sh для всех скриптов. Я пропустил это. – Justin

+0

Я вижу эту же проблему, но у меня есть '#!/Bin/bash' в верхней части моего скрипта. – prolink007

+6

Я понял вопрос. Если вы вызываете скрипт из другого скрипта, убедитесь, что используете 'bash nameofscript.sh' вместо' sh nameofscript.sh'. – prolink007

0

Если вы проверяете на равенство, не должно быть?

if [[ "${debugMode}" = "true" ]]; then .... fi

+0

В Bash в этом контексте '==' и '=' являются взаимозаменяемыми. –

Смежные вопросы