使用bash选择mysql查询
如何使用bash选择mysql查询,使每个列都位于单独的数组值中 我尝试了以下命令,但它只在内容为一个单词时有效。例如: id=11,text=hello,important=1 例如,如果我有一篇文章在文本中。代码将无法正常工作。我想我可以使用cut-f-d,但如果文本包含特殊字符,它也不会工作使用bash选择mysql查询,mysql,bash,Mysql,Bash,如何使用bash选择mysql查询,使每个列都位于单独的数组值中 我尝试了以下命令,但它只在内容为一个单词时有效。例如: id=11,text=hello,important=1 例如,如果我有一篇文章在文本中。代码将无法正常工作。我想我可以使用cut-f-d,但如果文本包含特殊字符,它也不会工作 while read -ra line; do id=$(echo "${line[1]}") text=$(echo "${line[2]}") important=$(ec
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手册页: -批次-B 使用tab作为列分隔符打印结果,每行在新行上。使用此选项,mysql不使用历史文件。 批处理模式导致非并行输出格式和特殊字符的转义。可以使用原始模式禁用转义;请参见-raw选项的说明 您希望转义结果,因此不要使用-raw,否则结果数据中的制表符将再次中断循环 要跳过第一行列名,可以使用选项-跳过列名 现在,您可以遍历每一行并按制表符将其拆分。 只有临时重写IFS变量,才能强制bash按tab拆分 范例 myread函数所有贷项都由 注意: 您需要非常小心地使用引号和变量分隔符。 如果只回显$row[0]而不使用花括号,则会得到错误的结果 编辑 由于内部字段分隔符匹配任何数量的已定义字符,因此当列返回空字符串时,仍然存在问题: row1\t\trow3将创建一个数组[row1,row3],而不是[row1,row3] 我找到了一个很好的方法来解决这个问题,更新了上面的示例。
另外,read还可以直接将输入流分离为变量。这并不像我想象的那么简单-请稍候,了解一个实际可行的解决方案OK,很抱歉造成混淆,示例正在运行。确保你使用了花括号,这很重要,谢谢!这节省了我的时间。
# 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")