использование переменной сценария оболочки - PullRequest
4 голосов
/ 06 января 2011

Я доберусь до мяса и костей:

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: не найден, поэтому я допускаю довольно грубую ошибку.Я чувствую, что логика достаточно здравая, просто простая синтаксическая ошибка, которую я делаю где-то из-за двух ошибок, которые, я думаю, могут быть в объявлении.

Ответы [ 2 ]

3 голосов
/ 06 января 2011

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

Вот ваш скрипт, переписанный на 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 голосов
/ 07 января 2011

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

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

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

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

until [ "$MY_VAR" -eq 0 ]

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

MY_VAR=`expr $MY_VAR - 1`

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

...