2017-06-08 57 views
0

這似乎很簡單,但我找不到任何關於如何執行此操作的問題:我基本上使用KSH變量來構建我的電子郵件正文文本。在錯誤/異常情況下,我想使用'\ n'作爲分隔符來轉儲env/printenv/export。Korn Shell - env,printenv,export - 如何獲得CRLF作爲分隔符

if (($status != 0)) 
then 
    MESSAGE="${MESSAGE}\n" 
    MESSAGE="${MESSAGE}\n\tBatch Process\t: ${BATCHPROCESS}" 
    MESSAGE="${MESSAGE}\n\tEnvironment\t: ${ENVTEXT}" 
    MESSAGE="${MESSAGE}\n\tDate/Time\t: ${STARTDATETIME}" 
    MESSAGE="${MESSAGE}\n\nRuntime:" 
    MESSAGE="${MESSAGE}\n$(env)" 
    echo -e $MESSAGE >> ${MAILFILE1} 
    mail -s"FAILURE - ${SUBJECT} " $MAILLIST < ${MAILFILE1} 

因此,根據對ENV/printenv /導出的文件,它已經在使用LF作爲分隔符,但是當我收到郵件,它只是一個文本的大塊:

Runtime: 

Runtime: 

我要的是一個單獨的行每個變量:

Runtime : 
ACCESSDB=[Sybase-Database] 
ACCESSSRV=[Sybase-Server] 
...etc... 

反正是有強制替代LF的「\ n」目前正在使用?

UPDATE:我使用SED -s 'S/$/\ r \ n/G' 和它的格式化ENV輸出,但現在整個電子郵件正文被作爲附件發送:

if (($status != 0)) 
then 
    MESSAGE="${MESSAGE}\n" 
    MESSAGE="${MESSAGE}\n\tBatch Process\t: ${BATCHPROCESS}" 
    MESSAGE="${MESSAGE}\n\tEnvironment\t: ${ENVTEXT}" 
    MESSAGE="${MESSAGE}\n\tDate/Time\t: ${STARTDATETIME}" 
    env | sort | sed 's/$/\r\n/g' > ${TEMPFILES}/env.txt 
    MESSAGE="${MESSAGE}\n\nRuntime:" 
    MESSAGE="${MESSAGE}\n$(cat ${TEMPFILES}/env.txt)" 

    echo -e "$MESSAGE" >> ${MAILFILE1} 
    mail -s"FAILURE - ${SUBJECT} " $MAILLIST < ${MAILFILE1} 

任何想法?我認爲這是一些在最大郵件大小的郵件設置,但我是一個Java程序員比殼牌scripter更多...

CLOSE SOLUTION:原來\ r \ n導致附件問題[https://access.redhat.com/solutions/1136493] 。所以我用的sed -s 'S/$/\ N/G',這是非常接近我想要的東西,除了ENV是採用雙線路輸出:

if (($status != 0)) 
then 
    MESSAGE="${MESSAGE}\n" 
    MESSAGE="${MESSAGE}\n\tBatch Process\t: ${BATCHPROCESS}" 
    MESSAGE="${MESSAGE}\n\tEnvironment\t: ${ENVTEXT}" 
    MESSAGE="${MESSAGE}\n\tDate/Time\t: ${STARTDATETIME}" 
    MESSAGE="${MESSAGE}\n\nRuntime:" 
    MESSAGE="${MESSAGE}\n$(env | sort | sed 's/$/\n/g')" 

    echo -e "$MESSAGE" >> ${MAILFILE1} 
    mail -s"FAILURE - ${SUBJECT} " $MAILLIST < ${MAILFILE1} 

生成輸出:

Runtime: 
ACCESSDB=[Sybase-Database] 

ACCESSSRV=[Sybase-server] 

ARCHIVEDB=[Sybase-Database] 

ASBIN=[Directory-Path] 

最終的解決方案:實現markp的修復,然後就拿出我的sed -s東西,它正常工作:

if (($status != 0)) 
then 
    MESSAGE="${MESSAGE}\n" 
    MESSAGE="${MESSAGE}\n\tBatch Process\t: ${BATCHPROCESS}" 
    MESSAGE="${MESSAGE}\n\tEnvironment\t: ${ENVTEXT}" 
    MESSAGE="${MESSAGE}\n\tDate/Time\t: ${STARTDATETIME}" 
    MESSAGE="${MESSAGE}\n\nRuntime:" 
    MESSAGE="${MESSAGE}\n$(env | sort)" 

    echo -e "$MESSAGE" >> ${MAILFILE1} 
    mail -s"FAILURE - ${SUBJECT} " $MAILLIST < ${MAILFILE1} 

TIA,adym

回答

2

嘗試在雙引號包裹$消息來維持特殊格式,空格等:

echo -e "$MESSAGE" >> ${MAILFILE1} 

無論你得到你所期望的「回聲-e」和「郵件-s」命令會出現什麼取決於你使用的是哪個版本的命令。

+0

你好,是的,試過這個。沒有不同。-adym – lincolnadym

+0

markp,事實證明你是正確的。我需要這樣做,以及拿出我的sed -s的東西。謝謝! adym – lincolnadym

1

由於@markp正確地指出,你的使用

echo $MESSAGE >>$MAILFILE1 

將替換字符串$消息幾個空格分隔參數的呼應和echo將簡單地把參數之間的空間。這類似於在你的地方打字

$ echo a  b    c 
a b c 

我會做這樣

echo "$MESSAGE"       >>$MAILFILE1 
echo "Batch Process:\t $BATCHPROCESS" >>$MAILFILE1 
echo "Environment: ...."    >>$MAKEFILE1 

或與在線文檔:

cat <<FINE >>$MAKEFILE1 
$MESSAGE 
Batch Process:  $BATCHPROCESS 
Environment: .... 
.... 
FINE 
相關問題