BASH-如何读取文件内容以将结果插入mysql WHERE子句

BASH-如何读取文件内容以将结果插入mysql WHERE子句,mysql,bash,variables,Mysql,Bash,Variables,我试图创建一个文件(称之为accounts)并让一个bash脚本(称之为*name\u checker*)在每一行中循环,并将其生成多个字符串,以存储在mysql WHERE in子句中名为“$NAMES”的变量中 例如: 我的脚本*name\u checker*中的查询是基本查询: 从帐户名称所在的表(“$NAMES”)中选择* IN语句的值需要用逗号分隔,并用单引号引起来 我的帐户文件将以换行符分隔名称: NAME1 NAME2 NAME3 所以我需要我的脚本(*name_checker*)

我试图创建一个文件(称之为accounts)并让一个bash脚本(称之为*name\u checker*)在每一行中循环,并将其生成多个字符串,以存储在mysql WHERE in子句中名为“$NAMES”的变量中

例如:

我的脚本*name\u checker*中的查询是基本查询:

从帐户名称所在的表(“$NAMES”)中选择*

IN语句的值需要用逗号分隔,并用单引号引起来

我的帐户文件将以换行符分隔名称:

NAME1

NAME2

NAME3

所以我需要我的脚本(*name_checker*)来去掉换行符,用单引号将每个名称括起来,并用逗号分隔。运行脚本时,所需的结果如下

从帐户名称所在的表中选择*('NAME1'、'NAME2'、'NAME3')

我在这方面遇到了一些困难,我对使用sed不太熟悉。谢谢你的帮助

names=“”$(cat | sed's/(\w)\n(\w)/\1\,\'\2/g)“

试试看


:D

尝试将其放入查询中:

echo $NAMES | sed -e "s/\([a-zA-Z]*\)/'\1',/g" -e 's/,$//';
例如:

$ NAMES='Martin John Barbera Holly'
$ echo $NAMES | sed -e "s/\([a-zA-Z]*\)/'\1',/g" -e 's/,$//';
'Martin', 'John', 'Barbera', 'Holly'

你也可以试试这个

Accounts.txt

NAME1
NAME2
NAME3
'NAME1','NAME2','NAME3'
代码

NAME=`awk '{print "-"$0"-"}' Accounts.txt| tr "-" "'" | tr '\n' ',' | sed 's/.$//g'`
echo "$NAME"
输出

NAME1
NAME2
NAME3
'NAME1','NAME2','NAME3'
注意-
在SQL代码中使用变量$NAME。

这将把换行符分隔的条目转换为单引号、逗号分隔的条目

var=$(awk '{print "\x27"$0"\x27"}' ORS=, accounts_file)
var="${var%,}"
注:

  • ORS
    表示输出记录分隔符。它基本上是用来终止awk输出的每一行的字符(默认值:换行符)
  • \x27
    是单引号的十六进制代码,以避免与外部单引号对冲突(因为单引号内不能有任何转义序列)
  • ${var%,}
    是一个删除尾部逗号的命令,因为
    awk
    命令会给您留下一个额外的逗号

  • 如果使用的是
    bash
    4或更高版本,则可以使用
    mapfile
    命令(也拼写为
    readarray
    )将整个文件拉入单个数组。然后,可以将数组扩展为逗号分隔的用户名的单个字符串

    $ mapfile users < Accounts.txt
    $ quotedUsers=( $( printf "'%s' " ${users[@]%?} ) )
    $ userString=$( IFS=,; echo "${quotedUsers[*]}" )
    
    $mapfile users
    无需调用外部实用程序即可完成此操作

    cat >Accounts.txt <<XXX
    NAME1
    NAME2
    NAME3
    XXX
    
    或者它甚至可以简化为删除显式循环

    printf -v NAMES ",'%s'" $(<Accounts.txt)
    NAMES=${NAMES:1}
    echo "$NAMES";
    

    我试过了,但在寻找匹配的```语法错误时,我得到了意外的EOF:文件的意外结尾试图使用结束引号,但我找不到需要的内容
    sed(1)
    可以直接读取文件。不需要为猫(1)使用另一个进程。嘿,对不起,我忘了跳过第二个单引号:P我在上一次发布时可能有点神经过敏^ ^你应该学会如何使用sed-tho,
    man-sed
    !$NAMES变量将被定向到另一个名为“accounts”的文件。很抱歉,作为示例,我几乎复制了我的shell。将文件直接传递给sed-例如
    sed-e“s/\([a-zA-Z]*\)/'\1',/g“-e's/,$/'帐户
    -这应该能满足您的需要。
    mapfile
    比使用
    ARR=($(
    mapfile
    作为一些其他选项更好,可以让您在读取每X行后调用回调函数(老实说,我从来没有完全弄清楚如何使用)。如果shell可以将任何一行拆分为多个单词,那么使用命令替换将无法给出预期的结果。
    printf-v quotedUsers''%s'“${users[@]]?}”
    就可以了,我相信(我忘了这个选项)ne.如果你的答案中包含了这一点,那么我认为没有理由修改我的答案来复制你已经拥有的。有很多方法可以完成这项任务;这只是其中一种。^^^^^很好!我特别喜欢这个结构
    $(IMHO使用4个外部实用程序有点过分。它可以在纯awk中完成。或者,我认为,在纯awk中完成。祝大家好运。
    
    'NAME1','NAME2','NAME3'