首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有来自命令的多行输出的Bash for循环

带有来自命令的多行输出的Bash for循环
EN

Stack Overflow用户
提问于 2012-06-08 20:28:17
回答 1查看 4.9K关注 0票数 2

我必须为我们的数据库编写一个小的多线程mysqldump脚本,因为一个表包含一个空格,所以我遇到了一些问题。

我的第一次尝试非常简单:

代码语言:javascript
复制
for TABLE in `mysql -u user -ppassword -e 'show tables;' dbname`  
do
    while [ 1 ]
    do
        if [ `jobs -r | wc -l` -lt $MAXTHREADS ]
        then
            break
        else
            sleep 1
        fi
    done

    mysqldump -u user -ppassword dbname $TABLE
done

不幸的是,有一张桌子,里面有一个空格。我在googled上搜索了一下,了解了如何将for循环与命令的多行输出结合使用,并且更改$IFS变量是一个常见的解决方案。所以我将它改为\n\b (当我只使用\n时,不知何故$IFS是空的),但这不是一个好主意,因为它导致mysql命令不再工作。

我认为,当我预先获得表并在每次使用for循环中的mysqldump时将$IFS改回时,这应该不是问题。但是我再一次弄错了,因为我现在只有一行所有的表。

我当前的代码:

代码语言:javascript
复制
TABLES=$(mysql -u user -ppassword -e "show tables" dbname | tail -n +2)

OIFS="$IFS"
AIFS=$(echo -en "\n\b")
IFS="$AIFS"

for TABLE in "$TABLES"
do
    IFS="$OIFS"
    while [ 1 ]
    do
        if [ `jobs -r | wc -l` -lt $MAXTHREADS ]
        then
            break
        else
            sleep 1
        fi
    done

    mysqldump -u user -ppassword dbname $TABLE
    IFS="$AIFS"

done
IFS="$OIFS"

当我尝试回显$TABLES变量时,我每行得到一个表,但是for循环只使用包含所有表的$TABLE变量运行一次。

提前感谢

kiro

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-08 23:14:11

使用while循环而不是for:

代码语言:javascript
复制
mysql -u user -ppassword -e "show tables" dbname | tail -n +2 | while read TABLE
do
    ...
done

...unless您需要在循环内设置任何变量,并在循环退出后使它们可用。因为这使得while循环成为管道的一部分,所以它在子shell中运行,并且变量等不会传输到主shell。如果需要在主shell中运行循环,可以使用bash的进程替换功能,而不是标准管道:

代码语言:javascript
复制
while read TABLE
do
    ...
done < <(mysql -u user -ppassword -e "show tables" dbname | tail -n +2)
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10948849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档