【问题标题】:Subshell MySQL-query in bashbash中的子shell MySQL查询
【发布时间】:2013-04-17 09:26:31
【问题描述】:

我正在尝试在 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 并在循环结束时中断它可以正常工作并打印:

127 777 777 777

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

【问题讨论】:

    标签: mysql bash shell ubuntu subshell


    【解决方案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 redirection 馈送到 while 循环的 substituted process。使用前面的简单示例:

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

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

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

    请注意,通过 &lt;() 进行的进程替换是 BASH 主义,不符合 POSIX。

    【讨论】:

      猜你喜欢
      • 2014-09-08
      • 2017-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-18
      • 2012-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多