Bash从变量中读取行



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}"

相关内容

  • 没有找到相关文章