Shell-Script

變數中的選項卡不起作用

  • August 26, 2017

我有這些行,我將在名為“header”的郵件中插入這些行。

header="
-------------------------------------
Name\tAge\tGender\tAddress
-------------------------------------
"

不幸的是,它\t並沒有像我預期的那樣工作。我什至試圖把這兩者\t之間````。

然後我把它$header放在自動電子郵件中。

mailx -s "$subject" -r "$from" "$to" <<-eof
$header

$body

$footer
eof
}

使用\n向標題添加換行符:

header="————————————-\n姓名\tAge\tGender\tAddress\n ————————————-\n"

然後使案例如echo -e $header顯示:

echo -e $header
-------------------------------------
Name    Age Gender  Address
-------------------------------------

如果echo -e不起作用,請printf改用。如果您的輸出以破折號開頭,則呼叫printf -- "$header"以告知printf將完整變數解釋為輸出,而不是嘗試將它們解析為參數。

經過更多測試後,原始變數也適用於 printf:

header="
-------------------------------------
Name\tAge\tGender\tAddress
-------------------------------------
"

printf -- "$header"

-------------------------------------
Name    Age     Gender  Address
-------------------------------------

要在其中使用它,mailx您可以使用:

mailx -s "$subject" -r "$from" "$to" <<eof
$header
$body
$footer
eof

如果您使用 ANSI 字元串:

header=$'
-------------------------------------
Name\tAge\tGender\tAddress
-------------------------------------
'

您的變數中已有任何 ANSI 轉義字元的正確翻譯。(注意:換行符也可以定義為\n,但在您的情況下它不會增加易讀性,因此我會保留您的原始格式,如本答案中所述)。

還有可能讓其他工具在每個使用它的地方進行轉換(而字元串仍然包含文本表示);例如:使用echo -e(如果您的版本echo支持該選項),或使用變數作為格式字元串printf其中轉義也將被解釋,如:printf "$header".

討論:使用printf具有POSIX標準的優勢。使用 ANSI 字元串的優點是轉換始終存在於變數中,無需進一步解釋。

由於(如更新的問題所示)該變數將在mailx不會解釋轉義字元的程序()的上下文中使用,因此該變數需要已經包含適當的格式;所以使用ANSI 字元串ksh93在 AIX 上)似乎是合適的解決方案。對於符合標準的解決方案,您還可以使用重新分配變數printf,例如:header="..." ; header=$( printf "$header" )

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