Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用bash选择mysql查询_Mysql_Bash - Fatal编程技术网

使用bash选择mysql查询

使用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

如何使用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=$(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")