我有点卡住了,我需要遍历所有的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循环?任何有关最佳方法的建议都将受到赞赏......
答案 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
的问题是select
和read
都从stdin读取输入,所以{{1将读取所有SQL行而不是提示用户输入。相反,我们将select
结果重定向到文件描述符mysql
,然后告诉4
使用它而不是stdin,而read
仍然像往常一样从stdin读取。
请注意,如果用户为select
输入不同的值(例如8而不是1,2或3),则select
将为空。您可以将$opt
中的行替换为:
select
这会一直提示用户输入,直到他们给出有效的回复。