gpt4 book ai didi

mysql - 使用 bash 选择 mysql 查询

转载 作者:可可西里 更新时间:2023-11-01 08:05:56 24 4
gpt4 key购买 nike

如何使用 bash select mysql 查询,使每一列都在一个单独的数组值中?

我试过下面的命令,但只有当内容是一个词时它才有效。例如:id= 11, text=hello, important=1

如果我在 text 中有一篇文章。该代码将无法正常工作。我想我可以使用 cut -f -d 但如果“文本”包含特殊字符,它也不会起作用。

while read -ra line; do
id=$(echo "${line[1]}")
text=$(echo "${line[2]}")
important=$(echo "${line[3]}")

echo "id: $id"
echo "text: $text"
echo "important: $important"

done < <(mysql -e "${selectQ}" -u${user} -p${password} ${database} -h ${host})

最佳答案

默认情况下,Bash 在任何空白字符处拆分字符串。首先,您需要为输出设置一个唯一的列标识符,您可以使用 mysql --batch 获取制表符分隔的 csv 输出。

来自 MySQL 手册页:

--batch, -B

Print results using tab as the column separator, with each row on a new line. With this option, mysql does not use the history file. Batch mode results in nontabular output format and escaping of special characters. Escaping may be disabled by using raw mode; see the description for the --raw option

您希望对结果进行转义,所以不要使用--raw,否则结果数据中的制表符会再次中断循环。

要跳过第一行(列名),您可以另外使用选项 --skip-column-names

现在您可以遍历每一行并按制表符将其拆分。您可以通过临时覆盖 IFS 变量 ( Internal Field Separator ) 强制 bash 按制表符拆分。

示例

# myread prevents collapsing of empty fields
myread() {
local input
IFS= read -r input || return $?
while (( $# > 1 )); do
IFS= read -r "$1" <<< "${input%%[$IFS]*}"
input="${input#*[$IFS]}"
shift
done
IFS= read -r "$1" <<< "$input"
}


# loop though the result rows
while IFS=$'\t' myread id name surname url created; do
echo "id: ${id}";
echo "name: ${name}";
echo "surname: ${surname}";
echo "url: ${url}";
echo "created: ${created}";
done < <(mysql --batch --skip-column-headers -e "SELECT id, name, surname, url, created FROM users")

myread 函数 所有归功于 this answer通过 Stefan Kriwanek

注意:您需要非常小心引号和变量定界符。如果你只是 echo $row[0] 而没有大括号,你会得到错误的结果

编辑你仍然有一个问题,当一列返回空字符串时,因为内部字段分隔符匹配任意数量的已定义字符:

row1\t\trow3 将创建一个数组 [row1,row3] 而不是 [row1,,row3]我找到了一个非常好的方法来解决这个问题,更新了上面的例子。同样read可以直接将输入流分离成变量。

关于mysql - 使用 bash 选择 mysql 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21109036/

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