Bash脚本 - 循环访问MySQL记录并根据用户选择更新记录

时间:2014-04-04 08:53:11

标签: bash

我有点卡住了,我需要遍历所有的mysql记录并根据用户输入更新其中一个字段。

我打算使用以下方法进行循环:

mysql -uuser -ppassword -s -e "SELECT company,product,category FROM MyTable"|while read varcomp varprod varcat;do

..然后使用PS3选择提供选项:

PS3 "Please select new category: "
select opt1 in "Blocks" "Dolls" "Puzzles"

...在使用之前,需要进行以下更新:

mysql -uuser -ppassword -s -e "UPDATE MyTable SET Category='$opt1' WHERE company='$varcomp' AND product='$varprod'"

...然后关闭循环。

我似乎无法让所有组件协同工作。我认为这是因为我使用了while循环?任何有关最佳方法的建议都将受到赞赏......

1 个答案:

答案 0 :(得分:0)

这应该有效:

while read -u 4 varcomp varprod varcat; do 
    echo "Company: $varcomp - Product: $varprod - Category: $varcat"
    PS3="Please select new category: "
    select opt in "Blocks" "Dolls" "Puzzles"; do
        mysql -uuser -ppassword -s -e "UPDATE MyTable SET Category='$opt' WHERE company='$varcomp' AND product='$varprod';"
        break
    done
done 4< <(mysql -uuser -ppassword -s --skip-column-names -e "SELECT company,product,category FROM MyTable;")

你有正确的想法,但在select循环中使用while read的问题是selectread都从stdin读取输入,所以{{1将读取所有SQL行而不是提示用户输入。相反,我们将select结果重定向到文件描述符mysql,然后告诉4使用它而不是stdin,而read仍然像往常一样从stdin读取。

请注意,如果用户为select输入不同的值(例如8而不是1,2或3),则select将为空。您可以将$opt中的行替换为:

select

这会一直提示用户输入,直到他们给出有效的回复。