如何在 C-shell echo 命令中包含换行符?

问题描述 投票:0回答:3

这听起来非常简单,而且对于其他 shell 也是如此。但我似乎无法弄清楚如何让回显显示换行符。例如 -

cat myFile

显示文件实际存在的样子,这就是我想要的 -

this
is
my
file

而我的脚本包含以下内容 -

#!/bin/csh
set var = `cat myFile`
echo "$var"

删除所有换行符,这不是我想要的 -

this is my file

提前致谢。

unix csh
3个回答
6
投票

问题不在于

echo
命令,而在于 csh 对反引号的处理。当你执行时

set var = `cat myFile`

来自

myfile
的换行符永远不会存储在
$var
中;它们被转换为空格。我想不出任何方法来强制 csh 变量包含从文件中读取的换行符,尽管可能有办法做到这一点。

sh 及其衍生物确实按照您想要的方式运行。例如:

$ x="`printf 'foo\nbar'`"
$ echo $x
foo bar
$ echo "$x"
foo
bar
$ 

赋值上的双引号会导致换行符(最后一个除外)被保留。

echo $x
用空格替换换行符,但
echo "$x"
保留它们。

最好的选择是做一些除了尝试将文件内容存储在变量中之外的事情。您在评论中说您正在尝试发送包含日志文件内容的电子邮件。因此,将文件的内容直接提供给您正在使用的任何邮件命令。我不知道所有细节,但它可能看起来像这样:

( echo this ; echo that ; echo the-other ; cat myFile ) | some-mail-command

强制参考:http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/


1
投票

您可以使用 Awk 用 ' 分隔每一行 ' 在 shell 将它们串在一起之前。

set var = `cat myfile | awk '{printf("%s\\n", $0)'}`

假设您的 echo 命令将解释“ " 作为换行符,

echo ${var}
应该重现
cat myfile
,而不需要额外的文件访问。如果无法识别换行符代码,您可以尝试添加 -e 标志来 echo 和/或使用 /bin/echo。


0
投票

如果每行没有空格,可以在需要时将变量内部的空格转换为换行符

echo $var | tr " " "\n"

如果每行都有空格,只需将每个换行符转换为其他内容,然后再将所有行存储在变量中即可。

© www.soinside.com 2019 - 2024. All rights reserved.