【问题标题】:MySQL - Fetch Space Separated Field in BashMySQL - 在 Bash 中获取空间分隔字段
【发布时间】:2015-04-28 07:20:34
【问题描述】:

我在 MYSQL 表中有以下列:

ID    START_TIME
51    2015-01-01 01:00:00

我在 Bash 中有以下 MySQL 查询:

Values=($(mysql -DHISTORIZATION -hlocalhost -uroot -pAdmin -se "SELECT ID, START_TIME FROM TABLE_NEW WHERE ID=51"));

当我尝试分配和打印这样的值时:

ID=Values[0];
START_TIME=Values[1];
echo $ID;
echo $ START_TIME;

打印如下:

51
2015-01-01

理想情况下,它应该打印出来,这是所需的输出:

51
2015-01-01 01:00:00

当我打印时

echo ${Values[*]};

打印出来:

51 2015-01-01 01:00:00

Values 包含三个元素,但它应该包含两个。 我认为这是由于“2015-01-01 01:00:00”中的空格字符造成的问题,但如何摆脱这个问题?如果不更改 IFS,我将不胜感激。

谢谢..

【问题讨论】:

  • 试试Values=($(mysql -DHISTORIZATION -hlocalhost -uroot -pAdmin -se "SELECT ID, START_TIME FROM TABLE_NEW WHERE ID=51 ENCLOSED BY '\"'")); 我在你的sql查询中添加了ENCLOSED BY '"'

标签: mysql bash shell unix datetime


【解决方案1】:

mysql 输出是制表符分隔的。
因此,这应该有效:

IFS=$'\t' read -a Values < <(mysql -DHISTORIZATION -hlocalhost -uroot -pAdmin -se "SELECT ID, START_TIME FROM TABLE_NEW WHERE ID=51");

【讨论】:

    【解决方案2】:

    您可以使用连接日期和时间的变量。

    echo ${value[*]};
    2015-04-28 13:30:00
    
    START_TIME=${value[0]}" "${value[1]}
    

    我建议在 mysql 参数中使用 -N 以便它跳过列名。

    【讨论】:

      【解决方案3】:

      这应该可行:

      IFS=$'\t'
      Values=($(mysql -DHISTORIZATION -hlocalhost -uroot -pAdmin -se "SELECT ID, START_TIME FROM TABLE_NEW WHERE ID=51"))
      ID=${Values[0]}
      START_TIME=${Values[1]}
      echo "$ID"
      echo "$START_TIME"
      

      【讨论】:

        【解决方案4】:

        使用进行数据库管理:

        兼容的答案(第一)...

        这是在 下测试的!

        #!/bin/sh
        
        user=root
        pass=Admin
        host=localhost
        db=HISTORIZATION
        fmreq="SELECT ID, UNIX_TIMESTAMP(START_TIME) as START_TIME
                 FROM TABLE_NEW WHERE ID=%d;"
        
        req="`printf  "$fmreq" $@`"
        
        mysql -B -D$db -u$user -p$pass -h$host --column-names -se "$req" | (
            tab=`printf "\t"`
            read ans
            ID="${ans%%$tab*}"
            START_TIME="${ans#*$tab}"
        
            date=`date -d @$START_TIME +"%F %T"`
            printf "Id   : %d\nStart: %s\n" $ID "$date"
        )
        

        根据要求:不玩$IFS(但

        #!/bin/bash
        
        user=root pass=Admin host=localhost db=HISTORIZATION
        fmreq="SELECT ID, START_TIME FROM TABLE_NEW WHERE ID=%d;"
        
        [ -f .mysqlcred ] && . .mysqlcred
        
        printf -v req "$fmreq" $@
        
        read -r ans < <(
            mysql -B -D$db -u$user -p$pass -se "$req"
        )
        
        array=()
        while [ "$ans" != "$last" ];do
            last="${ans%%$'\t'*}"
            ans="${ans#*$'\t'}"
            array+=("$last")
          done
        
        printf "Id   : %d\nStart: %(%F %T)T\n" "${array[@]}"
        declare -p array
        

        可以给:

        ./myscript 51
        Id   : 51
        Start: 2015-01-01 01:00:00
        declare -a array='([0]="51" [1]="1420070400")'
        

        或相同但使用关联数组

        #!/bin/bash
        
        user=root pass=Admin host=localhost db=HISTORIZATION
        fmreq="SELECT ID, START_TIME FROM TABLE_NEW WHERE ID=%d;"
        
        [ -f .mysqlcred ] && . .mysqlcred
        
        printf -v req "$fmreq" $@
        
        declare -A answer
        {
            read -r tit
            read -r ans
            while [ "$ans" != "$last" ];do
                last="${ans%%$'\t'*}"
                answer[${tit%%$'\t'*}]="$last"
                ans="${ans#*$'\t'}"
                tit="${tit#*$'\t'}"
            done
        } < <(
            mysql -D$db -u$user -p$pass --column-names -re "$req"
        )
        
        printf "Id   : %d\nStart: %(%F %T)T\n" ${answer[ID]} ${answer[START_TIME]}
        declare -p answer
        

        测试:

        ./myscript 51
        Id   : 51
        Start: 2015-01-01 01:00:00
        declare -A answer='([START_TIME]="1420070400" [ID]="51" )'
        

        但使用 $IFS 可能更简单

        #!/bin/bash
        
        user=root pass=Admin host=localhost db=HISTORIZATION
        fmreq="SELECT ID, START_TIME FROM TABLE_NEW WHERE ID=%d;"
        
        [ -f .mysqlcred ] && . .mysqlcred
        
        printf -v req "$fmreq" $@
        
        IFS=$'\t' read -a ans < <(
            mysql -B -D$db -u$user -p$pass -se "$req"
        )
        
        printf "Id   : %d\nStart: %(%F %T)T\n" ${ans[@]}
        

        请注意,以这种方式更改 IFS 不会改变脚本的其余部分。

        Id   : 0
        Start: 2015-01-01 01:00:00
        

        或者更强一点,使用关联数组

        #!/bin/bash
        
        user=root pass=Admin host=localhost db=HISTORIZATION
        fmreq="SELECT ID, UNIX_TIMESTAMP(START_TIME) as START_TIME
                 FROM TABLE_NEW WHERE ID=%d;"
        [ -f .mysqlcred ] && . .mysqlcred
        
        printf -v req "$fmreq" $@
        
        declare -A answer
        {
            read -r tit
            read -r ans
            while [ "$ans" != "$last" ];do
                last="${ans%%$'\t'*}"
                answer[${tit%%$'\t'*}]="$last"
                ans="${ans#*$'\t'}"
                tit="${tit#*$'\t'}"
            done
        } < <(
            mysql -D$db -u$user -p$pass --column-names -re "$req"
        )
        
        printf "Id   : %d\nStart: %(%F %T)T\n" ${answer[ID]} ${answer[START_TIME]}
        
        declare -p answer
        

        这可能会呈现如下内容:

        ./myscript 51
        Id   : 51
        Start: 2015-01-01 01:00:00
        declare -A answer='([START_TIME]="1420070400" [ID]="51" )'
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-06-05
          • 2020-07-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多