Ksh
刪除 sqlplus 中的所有選項卡
我可以解決這個問題,但我不明白為什麼會這樣。
我的任務是:(在 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