我确实遇到了一个任务来读取一个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的
答案 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
护理要点:
始终尝试引用变量
请勿使用$var
上的单引号,例如'$var'
使用$()
代替反对
当您需要逐行阅读文件时,请不要使用cat
。
注意:我还没有测试过您正在使用的sqlplus命令。它是由你决定的。