2016-06-05 3 views
0

Привет & заранее.Bash read строка из переменных

Я пытаюсь обновить столбец (версию) в таблице MySQL из сценария Bash.

Я заполнил переменную с номерами версий, но она не удалась после применения первой версии в списке.

КОД:

UP_VER=`seq ${DB_VER} ${LT_VER} | sed '1d'` 
UP_DB=`echo "UPDATE client SET current_db_vers='${UP_VER}' WHERE client_name='${CLIENT}'" | ${MYSQL_ID}` 
while read -r line 
do 
    ${UP_DB} 
    if [[ "${OUT}" -eq "0" ]]; then 
    echo "Database upgraded.." 
    else 
    echo "Failed to upgrade.." 
    exit 1 
    fi 
done < "${UP_VER}" 

Благодаря

Надеюсь решена ... Мой $ UP_VER находится в подряд не колонку.

+1

'UP_DB' не является командой; это * результат * команды. 'OUT' вообще не определяется. – chepner

ответ

1

Вы недопонимание, что несколько конструкций оболочки делают:

var=`command` # This executes the command immediately, and stores 
       # its result (NOT the command itself) in the variable 

... < "${UP_VER}" # Treats the contents of $UP_VER as a filename, and tries 
        # to use that file as input 

if [[ "${OUT}" -eq "0" ]]; then # $OUT is not defined anywhere 

... current_db_vers='${UP_VER}' ... # this sets current_db_vers to the entire 
            # list of versions at once 

Кроме того, в оболочке, лучше использовать нижний регистр (или смешанный регистр) имена переменных чтобы избежать конфликтов с переменными, которые имеют особые значения (которые имеют верхний регистр).

Чтобы исправить первую проблему, моя рекомендация не пытайтесь хранить команды оболочки в переменных, она не работает правильно. (См. BashFAQ #50: I'm trying to put a command in a variable, but the complex cases always fail!.) Либо используйте функцию, либо просто напишите команду непосредственно там, где она будет выполнена. В этом случае я бы проголосовал за то, чтобы просто поставить его прямо там, где он будет выполнен. Кстати, вы делаете ту же ошибку с ${MYSQL_ID}, поэтому я бы рекомендовал ее исправить.

Для второй проблемы вы можете использовать <<< "${UP_VER}" для подачи содержимого переменной в качестве входных данных (хотя это базис и не доступен в общих оболочках posix). Но в этом случае я бы просто использовать for цикл:

for ((ver=db_ver+1; ver<=lt_ver; ver++)); do 

Для третьей задачи, самый простой способ проверить успех команды, чтобы поставить его прямо в if:

if somecommand; then 
    echo "Database upgraded.." 
else # ... etc 

Итак, вот мое взятие на переписывание:

mysql_id() { 
    # appropriate function definition goes here... 
} 

for ((ver=db_ver+1; ver<=lt_ver; ver++)); do 
    if echo "UPDATE client SET current_db_vers='${ver}' WHERE client_name='${client}'" | mysql_id; then 
    echo "Database upgraded.." 
    else 
    echo "Failed to upgrade.." 
    exit 1 
    fi 
done 

... но я не уверен, я понимаю, что он должен делать. Кажется, что обновление current_db_vers по одному числу за раз, пока оно не достигло $ver_lt ... но почему бы не установить его прямо на $ver_lt в одном обновлении?

0

попробовать что-то вроде:

done <<< "${UP_VER}" 
Смежные вопросы