gpt4 book ai didi

shell - 如何更正 shell 脚本以识别另一台运行 Linux 的服务器上的换行符?

转载 作者:行者123 更新时间:2023-12-03 21:28:57 25 4
gpt4 key购买 nike

换行符在 server2 (Solaris) 上被正确识别,而在 server1 (Linux) 上被视为 backslashn 字符。我该如何纠正这个问题?

在编写一个接受参数并发送邮件的简单脚本时,我首先注意到了这种相当奇怪的行为..

语法:$ ksh SEND_MAIL.sh <to> <Subject> <body>

  1. 现在,当我在 server-1 上运行该脚本时

    [kent@server1] $ ksh SEND_MAIL.sh name@site.com "主题""123\n456"[2013 年 1 月 10 日星期四 10:51:18 EST] - 开始发送邮件至:name@site.com, 主题为\'>>>123\n456\'

    注意换行符被当作backlash-n。

  2. 在服务器 2 上,\n 特殊字符正确扩展为换行符。

    [kent@server2] $ ksh SEND_MAIL.sh name@site.com "主题""123\n456"[2013 年 1 月 10 日星期四 10:51:18 EST] - 开始发送邮件至:name@site.com, 与主题\'>>>123456\'

我想我可能需要更改一些 KornShell 环境变量,但我无法弄清楚。

更新:

在下面 Henk 的指导下...我发现仅了解差异不足以帮助我解决主要问题 - 即让 server1 上的脚本将 \n 字符识别为换行符。所以我改进了我的问题。


注意事项:

Server1 is a Linux server, while Server2 is Solaris.


环境细节 > KornShell: - 正如 Henk Langeveld 所建议的那样

在服务器 1 上:

[kent@server1]$ ksh --version
version sh (AT&T Research) 93t+ 2010-02-02
[kent@server1]$ echo ${.sh.version}
bash: ${.sh.version}: bad substitution
[kent@server1]$ [ "${ERRNO}" ] && echo ksh88 || echo ksh93
ksh93
[kent@server1]$ [ "`echo "\c" | grep c`" ] && echo ksh93 || echo ksh88
ksh93

在服务器 2 上:

# I'm am in bash
[kent@server2]$ ksh --version
$
$ ksh --version
$
[kent@server2]$ echo ${.sh.version}
bash: ${.sh.version}: bad substitution
[kent@server2]$ [ "${ERRNO}" ] && echo ksh88 || echo ksh93
ksh93
[kent@server2]$ [ "`echo "\c" | grep c`" ] && echo ksh93 || echo ksh88
ksh93

在服务器 1 和 2 上,我得到相同的行为:

$ echo -e "1\n2"
1
2
$ echo "1\n2"
1\n2
$ echo $'1\n2'
1
2

代码:

SEND_MAIL.sh

#Syntax: $ ksh SEND_MAIL.sh <to> <Subject> <body>
TO_REC=$1
SUBJECT=$2
MESSAGE=$3
echo "$MESSAGE"| mailx -s "$SUBJECT" $TO_REC

按照 Oliver 下面的建议,将 set | grep SH 行放在两台服务器上的脚本中以检查其运行的 shell。

在服务器 1 上:

[kent@server1]$ ksh SEND_MAIL.sh kent@123.com "Subject" ">>>123\n\n456$a"
KSH_VERSION=.sh.version
SHELL=/bin/bash
SHLVL=3
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
SSH_CLIENT='3.209.100.144 59645 22'
SSH_CONNECTION='3.209.100.144 59645 3.56.9.127 22'
SSH_TTY=/dev/pts/1
...

在服务器 2 上:

[kent@server2]$ ksh SEND_MAIL.sh kent@123.com "Subject" ">123\n\n456$a"
SHELL=/bin/ksh
SHLVL=1
SSH_CLIENT='3.209.100.144 49351 22'
SSH_CONNECTION='3.209.100.144 49351 3.56.29.159 22'
SSH_TTY=/dev/pts/2
...

最佳答案

这是 AST ksh93、pdksh 还是旧的 ksh88?

下面介绍了如何通过检查 ksh --version 的输出和 ${.sh.version} 的值来检查 ksh 的版本

$ ksh --version
version sh (AT&T Research) 93u+ 2012-06-26
$ ksh -c 'echo ${.sh.version}'
Version AJM 93u+ 2012-06-26

然后告诉我们两个服务器上的结果是否相同。旧版本的 ksh 实际上可能会报告错误。


ksh93 的解决方案:

在服务器 1 上,将您的\n 嵌入到 ksh93 Ansi 字符串 中,方法是将其包含在 $'' 中:

two_lines=$'one\ntwo'  && print "$two_lines"
one
two

这将推断任何 C 风格的转义。

关于shell - 如何更正 shell 脚本以识别另一台运行 Linux 的服务器上的换行符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14262017/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com