我有可能是一个基本的脚本问题,但我无法在任何地方找到答案。
我有一个处理文件的awk脚本,并吐出一系列已禁用的系统。当我从命令行手动调用它时,我得到格式化输出:
$awk -f awkscript datafile
The following notifications are currently disabled:
host: bar
host: foo
我正在编写一个包装脚本来从我的crontab调用,它将运行awk脚本,确定是否有任何输出,如果有,请给我发电子邮件。看起来像(简化):
BODY=`awk -f awkscript datafile`
if [ -n "$BODY" ]
then
echo $BODY | mailx -s "Disabled notifications" me@mail.address
else
echo "Nothing is disabled"
fi
当以这种方式运行并通过在脚本中添加echo $BODY
来确认时,输出将被删除格式化(换行符主要是我所关注的),所以我得到的输出看起来像: / p>
The following notitifications are currently disabled: host: bar host: foo
我正试图弄清楚如果我手动运行命令时如何保留存在的格式。
到目前为止我尝试过的事情:
echo -e `cat datafile | awkscript` > /tmp/tmpfile
echo -e /tmp/tmpfile
我试过这个,因为在我的系统(Solaris 5.10)上,使用echo而没有-e忽略标准的转义序列,如\ n。没工作。我检查了tmp文件,它没有任何格式,因此在存储输出时会出现问题,而不是在打印输出时。
BODY="$(awk -f awkscript datafile)"
echo -e "$BODY"
我尝试了这个,因为我能找到的一切,包括stackoverflow上的其他一些问题,说问题是如果没有引用shell,shell会用空格替换空格代码。没用。
我尝试使用printf而不是echo,使用$(命令)而不是`command`,并使用tempfile而不是变量来存储输出,但似乎没有任何东西可以保留格式。
我缺少什么,或者有其他方法可以避免这个问题吗?
答案 0 :(得分:8)
BODY=`awk -f awkscript datafile`
if [ -n "$BODY" ]
then echo "$BODY" | mailx -s "Disabled notifications" me@mail.address
else echo "Nothing is disabled"
fi
请注意echo
。
您也可以简化此版本:
echo -e `cat datafile | awkscript` > /tmp/tmpfile
echo -e /tmp/tmpfile
只是:
tmpfile=/tmp/tmpfile.$$
awkscript > $tmpfile
if [ -s $tmpfile ]
then mailx -s "Disabled notifications" me@mail.address < $tmpfile
else echo "Nothing is disabled"
fi
反引号很有用(但更好地写成$(cmd args)
)但不必在任何地方使用。
答案 1 :(得分:3)
使用引号应该有用,并且适用于我:
$ cat test.sh
#!/bin/bash -e
BODY=`cat test.in`
if [ -n "$BODY" ]; then
echo "$BODY" | mailx -s "test" username
else
echo "Nothing"
fi
$ cat test.in
The following notifications are currently disabled:
host: bar
host: foo
$ ./test.sh
$
这会向我发送格式正确的电子邮件。