2011-01-06 3 views
4

я доберусь до мяса и костей:сценария оболочки переменные использовать

MY_VAR=6 
until [$MY_VAR = 0] 
do 
dir/dir_$MY_VAR.log 
ps | grep "NAME_$MY_VAR.ksh" 
check some things 
if [results = ok] 
echo "program $MY_VAR sucessful" 
else 
echo "program $MY_VAR failure" 
MY_VAR = `expr $MY_VAR - 1` 
done 

Теперь я получаю следующие ошибки my_var не найдена и [6: не нашли, поэтому я предполагаю, довольно noobish ошибки , Я чувствую, что логика достаточно звучит, просто простая синтаксическая ошибка, которую я делаю где-то в результате двух ошибок, которые, я думаю, могут быть в объявлении.

ответ

3

У вас должно быть место после [ и до ], так как [ на самом деле является командой, а не разделителем.

Вот ваш сценарий переписан в Bash (или KSH):

my_var=6 
until ((my_var == 0)) 
do 
    dir/dir_$my_var.log # I have no idea what this is supposed to be 
    ps | grep "NAME_$my_var.ksh" 
    # check some things 
    if [[ $results = ok ]] 
    then 
     echo "program $my_var successful" 
    else 
     echo "program $my_var failure" 
     ((my_var--)) 
    fi 
done 

Однако:

for my_var in {6..1} 
do 
    dir/dir_$my_var.log # I have no idea what this is supposed to be 
    ps | grep "NAME_$my_var.ksh" 
    # check some things 
    if [[ $results = ok ]] 
    then 
     echo "program $my_var successful" 
    else 
     echo "program $my_var failure" 
    fi 
done 
+0

Я получаю сообщение об ошибке MY_VAR--: ожидалось больше токенов, не могли бы вы рассказать о своем решении, таком как использование (()) и [[]] – Jewsef

+0

@Jewsef: использование какой оболочки и на какой строке какой версии сценарии из моего ответа? Одно замечание, я изменил случай с именем переменной, но я сделал это непоследовательно. Возможно, это вызвало некоторые проблемы. Извините, что я исправил это. В двойных квадратных скобках Bash и ksh [включить некоторые дополнительные возможности] (http://mywiki.wooledge.org/BashFAQ/031). Использование двойных скобок для числовых сравнений позволяет использовать, например, '==' и '>' вместо уродливых '-eq' и' -gt'. Он также позволяет выполнять арифметические операции, такие как показание декремент '((my_var -))'. –

+0

@Jewsef: Я только заметил, что в скрипте в вашем вопросе отсутствует 'fi', чтобы закрыть' if'. Я скопировал ваш сценарий в свой ответ и пропустил исправление (теперь исправлено). Это может быть причиной вашей ошибки. –

0

Ваши две ошибки вызваны:

  • until [$MY_VAR = 0]
  • MY_VAR = $(expr $MY_VAR - 1)

[Я использовал $() вместо обратных кавычек, потому что я не мог получить кавычку в секцию коды]

Первая проблема заключается в отсутствии пробелов вокруг квадратных скобок - на обоих концах. Оболочка ищет команду [6 (после расширения $MY_VAR) вместо [ (посмотрите на /usr/bin/[ - это на самом деле программа). Вы также должны использовать -eq для выполнения числовых сравнений. = должен работать нормально здесь, но ведущие нули могут нарушить сравнение строк, где числовое сравнение будет работать:

until [ "$MY_VAR" -eq 0 ] 

Вторая проблема у вас есть пробела в вашем переменном назначении. Когда вы пишете MY_VAR = ..., оболочка ищет команду MY_VAR. Вместо этого написать:

MY_VAR=`expr $MY_VAR - 1` 

Эти ответы непосредственно ответить на ваши вопросы, но вы должны изучить ответ Деннис Уильямсона для лучших способов сделать это.

+0

Это правда, что '[' существует как '/ usr/bin/[', но это тоже встроенная оболочка и, как таковая, имеет приоритет. Будьте осторожны, полагаясь на начальное поведение нуля, '[008 -eq 8]' работает, но '[[008 -eq 8]]' дает ошибку «слишком большое значение для базы». Следует избегать обратных ссылок в любом случае, использование '$()' является предпочтительным. –

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