シェル:入れ子になった行を読みながら

シェル:入れ子になった行を読みながら

doc1.lstとdoc 2.lstという2つの文書があり、各行の内容を取得して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

問題は、各行の値を取得し、sqlplusクエリに示されているようにテーブルを更新できるようにパラメータ(p1とp2)として提供したいということです。

より良い理解のために、私のファイル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

このコンテンツを作成するには、2つのファイルの内容を繰り返すのではなく、2つのファイルを結合するだけです。paste両方のファイルで()を使用するpaste doc1.lst doc2.lstと、

AAA     30
ABC     10
EDF     30

pasteデフォルトではタブで接続されています)。 Givesを使用してpaste -d ' ' doc1.lst doc2.lst区切り記号を変更する

AAA 30
ABC 10
EDF 30

次にプレフィックスとして追加する必要があります。各行の先頭()を接頭辞に置き換えます@update.sqlsed^

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

実際に1行ずつ実行したい場合は、while read結果の各行を入力してくださいsqlplus64

おすすめ記事