Ksh

刪除 sqlplus 中的所有選項卡

  • July 14, 2017

我可以解決這個問題,但我不明白為什麼會這樣。

我的任務是:(在 ksh 中)

  • 第一步:使用 sqlplus 從數據庫中查詢一個數字,
  • 第二步:為郵件格式化一些文本,
  • 第三步:用這些發送郵件。

這是我的程式碼的一部分:

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

如果我想使用這個變數MAILTMP我必須使用tr -d '\040\011'我在這裡找到的,在 stackexchange 中,因為沒有 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?可能是數據庫特異性?(我在 TOAD 中檢查過,兩個列都是數字(18)。也許 ksh 中的函式有一些特殊功能?

在使用不同的數據庫時,我也遇到了這個不需要的空白。顯然,使用 shell 腳本和 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

引用自:https://unix.stackexchange.com/questions/240792