我可以解決這個問題,但我不明白為什麼會發生。
我的任務是:(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
如果我想使用這個變數郵件管理協議我必須使用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中的函數有一些特殊功能?
答案1
在使用不同的資料庫時,我也遇到過這種不需要的空格。顯然,使用 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]*//"
另一種快速但骯髒的修復方法是使用 shell 去除不需要的空白。保持你的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