Hi&提前谢谢。
我正在尝试从Bash脚本更新MySQL表上的一个列(版本)。
我已经用版本号填充了一个变量,但在应用列表中的第一个版本后失败了。
代码:
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在一行而不是一列中。
您误解了几个shell构造的作用:
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
此外,在shell中,最好使用小写(或大小写混合)的变量名,以避免与具有特殊含义的变量(均为大写)发生冲突。
为了解决第一个问题,我的建议是不要试图将shell命令存储在变量中,这是不正确的。(参见BashFAQ#50:我试图将命令放入变量中,但复杂的情况总是失败!)要么使用函数,要么直接将命令写入要执行的位置。在这种情况下,我会投票支持直接把它放在要执行的地方。顺便说一句,你在${MYSQL_ID}
上也犯了同样的错误,所以我建议你也解决这个问题。
对于第二个问题,您可以使用<<< "${UP_VER}"
将变量的内容作为输入(尽管这是一种抨击,在一般的posix shell中不可用)。但在这种情况下,我只使用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
。。。但是为什么不在单个UPDATE中将其直接设置为CCD_ 7呢?
尝试以下操作:
done <<< "${UP_VER}"