Вы недопонимание, что несколько конструкций оболочки делают:
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
в одном обновлении?
'UP_DB' не является командой; это * результат * команды. 'OUT' вообще не определяется. – chepner