如何读取文本文件中的多行,并在shell脚本中逐个传递给sql脚本

时间:2015-05-18 14:34:58

标签: shell

我确实遇到了一个任务来读取一个txt文件并在运行时将它传递给sql文件或sql查询在shell脚本中逐个

我在下面解释了更多

我的数据位于File.txt文件中,管道分隔如下(可能是n(100到1000)个数字,因此脚本必须读取此文件并将值逐个传递给sql查询以检索记录,例如,如果我有20条记录,循环必须读取并将第一个和后续数据传递给sql查询以从数据库中检索数据

14389056|Alpha
13467895|Beta
15679084|Charlie

所以我写了下面的脚本

MY_PATH=/home/CBS1/CBS2/sara
MY_FILE=$MY_PATH/File.txt

var_a=`cat $MY_FILE|wc -l
if [ "var_a" -gt 0 ]
then
IFS=' '
while read line 
do
var_b=`cat MY_FILE|cut -f 1 -d '|'
var_b=`cat MY_FILE|cut -f 2 -d '|'
t=`sqlplus -s usr/pwd$host
select * from table_name where column_name='$var_b' and column_name='$var_c';
EOF`
echo $t
done < $MY_FILE

当我运行上面的脚本时,当文件有一条记录如下

时,它正在工作
14389056|Alpha

但是,当我在文件中有多个记录时,它传递空值!

我错过了什么?我是否需要对循环中的任何更改进行操作?

你的帮助很高。

此致 Tk的

2 个答案:

答案 0 :(得分:0)

代码

var_a=`cat $MY_FILE|wc -l

不起作用。它应该是

var_a=$(cat $MY_FILE|wc -l)

或至少

var_a=`cat $MY_FILE|wc -l`

(注意最后的结束反击)。

$(...)几乎总是优先于反对; $()适当地嵌套,引用和逃脱的问题较少,结果中的空格不做有趣的事情。

然后在循环中,分配var_b两次;其中一个应该是var_c

最后,调用sqlplus不会起作用;缺少<<EOF

t=$(sqlplus -s usr/pwd$host <<EOF
select * from table_name where column_name='$var_b' and column_name='$var_c';
EOF)

注意:var_x是变量的一个非常糟糕的名称。

答案 1 :(得分:0)

更改您的代码:

MY_PATH=/home/CBS1/CBS2/sara
MY_FILE="$MY_PATH"/File.txt

while IFS= read -r line 
do
var_b=$(echo "$line"|cut -f 1 -d '|')
var_c=$(echo "$line"|cut -f 2 -d '|')
t=$(sqlplus -s usr/pwd$host select * from table_name where column_name="$var_b" and column_name="$var_c")
echo "$t"
done < file

护理要点:

  1. 始终尝试引用变量

  2. 请勿使用$var上的单引号,例如'$var'

  3. 使用$()代替反对

  4. 当您需要逐行阅读文件时,请不要使用cat

  5. 注意:我还没有测试过您正在使用的sqlplus命令。它是由你决定的。