この問題を解決できますが、なぜそのようなことが起こるのか理解できません。
私の使命は:(ksh)
- ステップ1:sqlplusを使用してデータベースから数字を照会します。
- ステップ2:電子メールのいくつかのテキスト形式を指定します。
- ステップ3:これをEメールで送ってください。
これは私のコードの一部です。
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
この変数を使用したい場合メール管理契約tr -d '\040\011'
trがなければ、結果は次のようになるため、stackexchangeで見つかったものを使用する必要がありました。
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では、このタブはどこから来ましたか?たぶんデータベースに固有ですか? (TOADを確認してみると、両方の列は数字(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