gpt4 book ai didi

mysql - bash 中的子 shell MySQL 查询

转载 作者:行者123 更新时间:2023-11-29 13:54:40 24 4
gpt4 key购买 nike

我试图在 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

但是当我替换这个 block 时:

mysql -h$DB_HOST -u $DB_USER -p$DB_PASS $DB_NAME --skip-column-names --default-character-set=UTF8 -e "这里是一个查询"|同时阅读“这里从记录集中获取变量”;

只需 while true 并在循环结束时中断,它就可以正常工作并打印:

127 777 777 777

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

最佳答案

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

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

由于您使用的是 BASH,因此您可以移动 mysql命令从管道到 substituted process喂给while通过 STDIN 循环 redirection 。使用前面的简单示例:

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..])

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

关于mysql - bash 中的子 shell MySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16056348/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com