gpt4 book ai didi

mysql - while 循环中的变量不会被记住。 Mysql bash脚本auto_increment

转载 作者:行者123 更新时间:2023-11-29 06:41:19 26 4
gpt4 key购买 nike

我已经为这个脚本工作了很长一段时间。但是当我尝试添加一个变量($EMAIL_MSG)来存储一些文本字符串以便稍后通过电子邮件发送时,我开始看到一些错误。好像while循环里面的变量没有被记住。 ( A variable modified inside a while loop is not remembered )

这是脚本的一部分:

#!/bin/bash
#
# This is bash script checks when auto_increment column is reaching its limit
# To run Script $ ./auto_increment_check.sh [username] [password]

MYSQL_USER="$1"
MYSQL_PASSWD="$2"
MYSQLCONNECT="mysql -u$MYSQL_USER -p$MYSQL_PASSWD"
MAX_RATIO="0.8" # Max percentage of fullness of an auto_increment column (ex. '0.8' means 80% full)
EMAIL_MSG=""
EMAIL_RCPNT="user@company.com"

QUERY="
SELECT table_schema,
table_name,
data_type,
( CASE data_type
WHEN 'tinyint' THEN 255
WHEN 'smallint' THEN 65535
WHEN 'mediumint' THEN 16777215
WHEN 'int' THEN 4294967295
WHEN 'bigint' THEN 18446744073709551615
end >> IF(Locate('unsigned', column_type) > 0, 0, 1) ) AS max_value
FROM information_schema.columns
WHERE table_schema NOT IN ( 'mysql', 'information_schema', 'performance_schema')
AND data_type IN ('tinyint','smallint','mediumint','int','bigint')
AND extra = 'auto_increment'"

$MYSQLCONNECT --batch -N -e "$QUERY" | while read DATABASE TABLE DATA_TYPE MAX_VALUE;

do
NEXT_AUTO_INCREMENT=`$MYSQLCONNECT --batch -N -e "show create table $DATABASE.$TABLE" | awk -F'AUTO_INCREMENT=' 'NF==1{print "0";next}{sub(/ .*/,"",$2);print $2}'`
AUTO_INCREMENT_RATIO=$(awk 'BEGIN {printf "%3.2f\n", '$NEXT_AUTO_INCREMENT' / '$MAX_VALUE'}')

if [[ $(awk 'BEGIN{print ('$AUTO_INCREMENT_RATIO'>='$MAX_RATIO')}') -eq 1 ]] ; then
EMAIL_MSG="$EMAIL_MSG\n\nAuto Increment Warning on $(hostname) - $DATABASE.$TABLE - NEXT AUTO INCREMENT: $NEXT_AUTO_INCREMENT, MAX CAPACITY: $MAX_VALUE, RATIO: $AUTO_INCREMENT_RATIO."
fi

done

if [ EMAIL_MSG != "" ]; then
echo -e $EMAIL_MSG | mail -s "Auto Increment Warning on $(hostname) " $EMAIL_RCPNT
fi

问题似乎是 while 循环是在子 shell 中执行的。因此,一旦子 shell 退出,我对变量 $EMAIL_MSG 所做的任何更改都将不可用。

我读到我应该像这样修改 while 循环:

while read DATABASE TABLE DATA_TYPE MAX_VALUE;
do
...
...
...
done <<< '$MYSQLCONNECT --batch -N -e "$QUERY"'

if [ EMAIL_MSG != "" ]; then
echo -e $EMAIL_MSG | mail -s "Auto Increment Warning on $(hostname) " $EMAIL_RCPNT
fi

但是我遇到了错误:

[root@localhost /]# ./vagrant/auto.sh root root
Mon Jan 27 21:04:01 UTC 2014: Auto Increment Check starting.
./vagrant/auto.sh: line 53: syntax error near unexpected token `--batch'
./vagrant/auto.sh: line 53: `done <<< $MYSQLCONNECT --batch -N -e "$QUERY"'

有什么解决办法吗?

最佳答案

尝试:

done < <($MYSQLCONNECT --batch -N -e "$QUERY")

构造 <(...)称为进程替换。它运行括号内的命令并使其输出可用,就好像已创建 FIFO 一样。构造 < <(...)将 FIFO 的输出连接到 while 循环中的标准输入。

进程替换需要bash以及支持 FIFO 的操作系统,例如 linux。纯粹的 bourne shell 将不支持它。

或者,这可以作为此处的字符串来完成:

done <<<"$($MYSQLCONNECT --batch -N -e "$QUERY")"

这使用命令替换 ( $(...) ) 来捕获 $MYSQLCONNECT 的输出命令,然后使用此处字符串 ( <<< ) 将其作为标准输入提供给您的 while read环形。请注意命令替换外的双引号。它们是在命令输出中保留换行符所必需的。没有那些双引号, $MYSQLCONNECT 的输出会出现在while read循环为一条长线。

如果使用单引号而不是双引号,如下所示:

done <<<'$($MYSQLCONNECT --batch -N -e "$QUERY")' # Don't use this

然后不会执行任何命令,并且文字字符串 $($MYSQLCONNECT --batch -N -e "$QUERY")将提供给 while read循环。

关于mysql - while 循环中的变量不会被记住。 Mysql bash脚本auto_increment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21393700/

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