变量中的选项卡不起作用

变量中的选项卡不起作用

我将这几行插入到名为“标题”的邮件中。

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

不幸的是,它\t并没有像我预期的那样工作。我什至尝试将两者放在\t两者之间``

然后我把它放在$header自动电子邮件中。

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

$body

$footer
eof
}

答案1

如果您使用 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" )

答案2

使用\n向标题添加换行符:

header="------------------------------------\n姓名\t年龄\t性别\t地址\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

答案3

另一种可能的选择是使用 awk:

$ echo "Name Age Gender Address" | awk -F' ' '{ printf "%s\t%s\t%s\t%s\n", $1, $2, $3, $4 }'

产生:

Name    Age     Gender  Address

或者直接使用 printf :

$ printf "%s\t%s\t%s\t%s\t\n" Name Age Gender Address

产生:

Name    Age     Gender  Address

答案4

man echo

通常,您可以使用(双连字符)来区分标志和以连字符开头的字符串。由于 echo 命令不支持任何标志,因此按字面意思处理(双连字符)。

在第二个例子中:

注意:如果消息包含转义序列,则必须将其放在引号中。否则,shell 将 \(反斜杠)解释为元字符,并以不同方式对待 \。

事实上,在 AIX 上:

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

~> echo -e $header
-e ------------------------------------- Name   Age     Gender  Address -------------------------------------
~> echo "$header"

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

相关内容