0

我正在尝试在 Ubuntu bash 中的循环中设置变量,该变量正在从数据库中获取记录集,但该变量设置为之前的值。这是一个代码:

#!/bin/bash
PREV_FILE_PATH="127"

while true
do
    echo "$PREV_FILE_PATH"
    mysql -h$DB_HOST -u $DB_USER -p$DB_PASS $DB_NAME --skip-column-names --default-character-set=UTF8  -e "here is a query" | while read "here is getting variables from recordset";

    do

    PREV_FILE_PATH="777"

    done

done

这段代码每次都会打印:

127 127 127

但是当我替换这个块时-:

mysql -h$DB_HOST -u $DB_USER -p$DB_PASS $DB_NAME --skip-column-names --default-character-set=UTF8 -e "here is a query" | while read "here is getting variables from recordset";

while true在循环结束时使用 just and break 它可以正常工作并打印:

127 777 777 777

脚本创建一些子shell 并在该子shell 中运行该MySQL 查询。那么我应该怎么做才能让脚本改变那个变量呢?

4

1 回答 1

1

正如您所指出的,问题是由于创建了一个子shell,该子shell 是由将mysql命令的输出通过管道传输到while循环引起的。一个简单的例子:

PREV_FILE_PATH=127
echo test | while read _; do
   PREV_FILE_PATH=777
done
echo $PREV_FILE_PATH
# output: 127

由于您使用的是 BASH,因此您可以将mysql命令从管道移动到通过 STDIN重定向馈送到循环的替代进程。使用前面的简单示例:while

PREV_FILE_PATH=127
while read _; do
   PREV_FILE_PATH=777
done < <(echo test)
echo $PREV_FILE_PATH
# output: 777

因此,要修复您的代码,您需要以mysql与我在上面移动命令相同的方式移动echo命令:

while read "here is getting variables from recordset"
do
   PREV_FILE_PATH="777"
done < <(mysql -h$DB_HOST -u $DB_USER [..remaining options..])

请注意,进程替换 via<()是 BASH 主义,不符合 POSIX。

于 2013-10-03T04:15:11.303 回答