Shell
外殼:同時讀取行嵌套
我有兩個文件: 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
我想用這些值來更新我的表。
據我了解(最後的
<<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.lst
用給定更改分隔符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
。