Shell : while 读取嵌套行

Shell : while 读取嵌套行

我有两个文档:doc1.lst 和 doc 2.lst 我想获取每行的内容并将其作为 SQL 查询的参数。

我尝试过类似的事情,请纠正我

    file=doc1.lst
    while read line
    do
       p1=$line;

    file=doc2.lst
    while read line
    do
       p2=$line;

        sqlplus64 $User/$Pass@$ORACLE_SID << EOF2
        @update.sql p1 p2

    done < echo "Ok"
    done < echo "Ok"
    EOF2

问题是我想获取每一行的值并将其作为参数(p1 和 p2),以便能够更新我的表,如 sqlplus 查询中所示。

为了更好地理解我的文件 doc1.lst 如下所示:

    AAA
    ABC
    EDF

我的文件 doc2.lst :

    30
    10
    30

我想用这些值来更新我的表。

答案1

据我了解(<<EOF2最后的内容并不十分清楚),您所追求的最终结果是将以下内容输入sqlplus64

@update.sql AAA 30
@update.sql ABC 10
@update.sql EDF 30

要生成此内容,您可以将它们组合起来,而不是循环遍历两个文件的内容。paste对两个文件使用( paste doc1.lst doc2.lst) 给出

AAA     30
ABC     10
EDF     30

paste默认情况下与选项卡连接)。使用paste -d ' ' doc1.lst doc2.lstGives更改分隔符

AAA 30
ABC 10
EDF 30

然后我们需要添加@update.sql作为前缀;这可以通过sed将每行的开头 ( ^) 替换为前缀来完成:

paste -d ' ' doc1.lst doc2.lst | sed 's/^/@update.sql /'

产生所需的结果。

然后可以将其一次性输入sqlplus64

paste -d ' ' doc1.lst doc2.lst | sed 's/^/@update.sql /' | sqlplus64 $User/$Pass@$ORACLE_SID

如果您需要exit在脚本末尾输入sqlplus64

(paste -d ' ' doc1.lst doc2.lst | sed 's/^/@update.sql /'; echo exit) | sqlplus64 $User/$Pass@$ORACLE_SID

如果您确实想逐行运行,则可以将while read结果的每一行提供给它sqlplus64

相关内容