この問題は解決できますが、なぜ発生するのかはわかりません。
私の仕事は次のとおりです: (ksh単位)
- ステップ1: sqlplusを使用してDBから数値をクエリします。
- 2番目のステップ: メールのテキストをフォーマットする
- 3 番目のステップ: これらを記載したメールを送信します。
これは私のコードの一部です:
psnr() {
sqlplus -s USR/PASS@PROD << EOS
SET PAGESIZE 0
SET COLSEP ";"
SET FEEDBACK OFF
SET TRIMOUT ON
SET TRIMSPOOL ON
select max_number-last_number from postalslip
where state = 'OPEN'
/
exit
/
EOS
}
この関数を呼び出すと、1234567 という数値が返されます。
PSNR=$(psnr)
メールに一言書きます:
echo "Today's result is: $PSNR" > $MAILTMP
この変数を使いたい場合メールここで、stackexchange で見つけたものを使用する必要がありますtr -d '\040\011'
。tr なしの結果は次のようになります。
od -c mailtmp.17872.txt
0000000 T o d a y ' s r e s u l t i
0000020 s : \t 1 2 3 4 5
0000040 6 7 \n
0000043
タブ '\t' が理解できません。どこから来たのでしょうか、sqlplus からでしょうか? おそらく DB の特殊性でしょうか? (TOAD で確認したところ、両方の列が number(18) です。ksh の関数に特別な機能があるのでしょうか?
答え1
別のデータベースで作業しているときにも、この不要な空白に遭遇したことがあります。明らかに、シェル スクリプトや SQLPlus などのツールは、データベースからデータを抽出するのには適していませんが、便利な場合もあります。
私の解決策は、結果から先頭と末尾の空白を削除することです。
psnr() {
sqlplus -s USR/PASS@PROD << 'EOS' | sed -e $'s/^[ \t]*//' -e $'s/[ \t]*$//'
SET PAGESIZE 0
SET COLSEP ";"
SET FEEDBACK OFF
SET TRIMOUT ON
SET TRIMSPOOL ON
select max_number-last_number from postalslip
where state = 'OPEN'
/
exit
/
EOS
}
ksh
文字列構文をサポートしていない場合は、$'...'
簡単に置き換えることができます。
# Original style
sed $'s/^[ \t]*//'
# Alternative style
T=$(printf "\t")
...
sed "s/^[ $T]*//"
psnr()
代わりに、シェルを使用して不要な空白を削除するという手っ取り早い修正方法があります。関数を変更せずに、代わりに次のコードを実行します。
echo "Today's result is: $PSNR" > $MAILTMP
次のように書きます:
echo "Today's result is:" $PSNR > $MAILTMP
答え2
sqlplus <<'EOF' | perl -pe 's/\t//g'
Some queries here
EOF
これはスペースがタブであることを意味します。私のsqlplusクエリはspace
csv形式で出力されるので、不要なスペースを削除するためにこれを使用します。
echo 'foo bar ,baz ,foobar ' | perl -pe 's/ +,/,/g ; s/ +$//g'
foo bar,baz,foobar