bash - Shell 脚本,将命令输出存储在变量中并保留格式

标签 bash shell unix

<分区>

Possible Duplicate:
Capturing multiple line output to a bash variable

我有一个可能是基本脚本问题,但我无法在我看过的任何地方找到答案。

我有一个处理文件的 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 进行确认,输出的格式被去除(换行符主要是我关心的),所以我得到了输出看起来像:

The following notitifications are currently disabled: host: bar host: foo

我正在尝试弄清楚如果我手动运行命令,如何保留存在的格式。

到目前为止我尝试过的事情:

echo -e `cat datafile | awkscript` > /tmp/tmpfile
echo -e /tmp/tmpfile

我尝试这样做是因为在我的系统 (Solaris 5.10) 上,使用不带 -e 的 echo 会忽略像\n 这样的标准转义序列。没用。我检查了 tmp 文件,它没有任何格式,所以问题发生在存储输出时,而不是打印出来时。

BODY="$(awk -f awkscript datafile)"
echo -e "$BODY"

我试过这个,因为我能找到的所有东西,包括 stackoverflow 上的其他一些问题,都说问题是如果没有引用,shell 会将空白代码替换为空格。没用。

我尝试过使用 printf 代替 echo,使用 $(command) 代替 `command`,并使用临时文件代替变量来存储输出,但似乎没有任何东西可以保留格式。

我错过了什么,或者是否有另一种方法可以避免这个问题?

最佳答案

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))但不必在任何地方都使用。

关于bash - Shell 脚本,将命令输出存储在变量中并保留格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8837129/

相关文章:

bash - sudo : ./untitled.sh: 找不到命令

android - 运行 adb shell 命令时需要 :android. 权限。WRITE_SECURE_SETTINGS

c - 使用 execl 获取 grep 值

bash - 如何强制 Git for Windows 的 bash-shell 不将路径字符串转换为 Windows 路径?

bash - 为什么 "var=value somecommand"不保留 var 的新值?

linux - 如何确定脚本是否作为 nohup 完成运行?

user-interface - GUI程序需要标准流吗?

node.js - 尽管 ~/.bashrc 和 ~/.bash_profile 中都存在 "nvm"变量,但在新命令行窗口/选项卡中无法识别 "NVM_DIR"命令

bash - 如何让 Vim 从 shebang 行检测文件类型?

bash - sed/Awk/cut...如何决定使用哪个来解析 Docker 输出?