2012-06-07 3 views
1

В настоящее время я конвертирую скрипт csh в linux в сценарий bash на льве Mac OS X.Преобразование скрипта csh в bash script

ЖСС сценарий выглядит следующим образом:

setenv CNS_SOLVE '/Users/ucbthsa/Documents/haddock2.1/software/bin/' 
setenv CNS_SOLVE $CNS_SOLVE 
if (-d $CNS_SOLVE) then 
    if (! $?CNS_ARCH) setenv CNS_ARCH `$CNS_SOLVE/bin/getarch` 
else 
    setenv CNS_ARCH 'unknown' 
endif 

Мое обращение в Баш скрипт Mac выглядит следующим образом:

export CNS_SOLVE='/Users/ucbthsa/Documents/haddock2.1/software/bin/cns_solve_1.3' 
export CNS_SOLVE=$CNS_SOLVE 

if [ -d $CNS_SOLVE ]; then 
    if [ ! $?CNS_ARCH ]; then 
    export CNS_ARCH='$CNS_SOLVE/bin/getarch' 
else 
    export CNS_ARCH='unknown' 
endif 

Когда я пытаюсь и подключим Баш скрипт Mac я получаю следующее сообщение об ошибке:

-bash: cns_solve_env: line 10: syntax error: unexpected end of file

Я не могу понять, почему я получаю эту ошибку.

+1

"fi" вместо "endif"? – SignalToNoise

+1

2 если, один endif. – bmargulies

+0

О, и есть еще и второй, если это не закрыто – SignalToNoise

ответ

3

Вы должны использовать fi, а не endif и вы не закрывая первую, если вообще:

export CNS_SOLVE='/Users/ucbthsa/Documents/haddock2.1/software/bin/cns_solve_1.3' 
export CNS_SOLVE=$CNS_SOLVE 

if [ -d $CNS_SOLVE ]; then 
    if [ -z $CNS_ARCH ]; then 
    export CNS_ARCH="$CNS_SOLVE/bin/getarch" 
    fi 
else 
    export CNS_ARCH='unknown' 
fi 

* Редактирование: изменилось второе испытание, как и Уильям Перселл отметил, что не будет работать, как это было в bash.

+1

'! $? CNS_ARCH' всегда будет оценивать значение false, так как тестируемая строка всегда будет 'XCNS_ARCH', где' X' - значение '$?'. –

+2

Вы должны делать двойную кавычку при расширении переменных: '[-d" $ CNS_SOLVE "]' и особенно '[-z" $ CNS_ARCH "]', чтобы избежать разбора путаницы. Кроме того, одинарные кавычки предотвращают расширение переменных, поэтому используйте 'export CNS_ARCH = '$ CNS_SOLVE/bin/getarch" ' –

0

$?CNS_ARCH означает что-то другое в ш. Использование:

test -z "$CNS_ARCH" && CNS_ARCH=$($CNS_SOLVE/bin/getarch) 

или

CNS_ARCH=${CNS_ARCH-$($CNS_SOLVE/bin/getarch)} 

Обратите внимание, что они имеют несколько иной смысл. Первый будет присваивать CNS_ARCH, если CNS_ARCH уже установлен, но является пустой строкой, а второй не изменит CNS_ARCH, если он уже установлен, но пуст, что и делает $? в csh, но, вероятно, не то, что вы действительно хочет.

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