前提・実現したいこと
シェルスクリプトを使用してファイルサーバーとDBサーバーの整合性の確認ツールを作成しております。
・ファイルのパス一覧csvをファイルサーバーより取得
・取得したcsvファイルをシェルスクリプトのwhilereadで1行づつ読み出しsqlの引数に渡し、sqlでDBのSELECTを行う
上記のようなプログラムを作成しているのですが、sql側で「.」が変数の終了文字となっている為、拡張子がいらない部分と判断されエラーとなっております。
「.」付きの値を渡す方法はあるのでしょうか。
#エラーメッセージ
path = 123456789.pdf * ERROR at line 6: ORA-00933: SQL command not properly ended
#現在行った対応
・引数で渡すファイルの「.」の前に¥を配置し、sql側でSET ESCAPE ¥ を記載
・sql側でSET BLOCKTERMINATOR OFF
#ファイル内容
・fileList.csv ※イメージ
1111 /***/***/***/123456789.pdf 1111 /***/***/***/234567890.pdf
・check.sh
#!/bin/bash readonly SQLNAME="check.sql" cat fileList.csv | while read line do file_name=`echo $line | grep '^[0-9]' | cut -d '/' -f5` if [ -n "$file_name" ]; then sqlplus -s ***/*** << EOF @${SQLNAME} ${file_name} EOF fi done
・check.sql
SET LINESIZE 10000 SET PAGESIZE 0 SET FEEDBACK OFF SET TAB OFF SET VERIFY OFF select path from target where filename = &1; EXIT; /
・実行コマンド
sh check.sh
質問を実際に実行できる内容に修正してください。
実際に実行している内容に修正致しました。
fileList.csvの内容も実際には「*」じゃなくて先頭に数字が書いてあるのでは?
じゃないと、途中のgrepで何も引っかからなくなるし、その前のechoで「*」が展開されてしまう。
失礼致しました。
csvの先頭はpdfファイルのバイト数です。
適当な値でとりあえずアスタを代入しておりました。
「引数で渡すファイルの「.」の前に¥を配置し」という処理が書いてないようですが。
うまく動作しなかったため対応する前のソースを記載しておりました
file_name=echo $line | grep '^[0-9]' | cut -d '/' -f5
↓
file_name=echo $line | grep '^[0-9]' | cut -d '/' -f5 | sed -e ‘s/¥.pdf$/¥¥¥¥¥.pdf/g‘
え、そこに入れてしまうと、その後の「if [ -n "$file_name" ]; then」のテストに失敗するのでは。
返信遅れましてすいません
file_nameの変数の中には「123456789¥.pdf」のような形式で値が入り、記載して頂いたif文はnull判定をしているだけなので中の処理は通る事は通ります。
回答1件
あなたの回答
tips
プレビュー