将shell输出的最后一行保存为变量

61
我正在使用exiftool处理一个shell脚本,自动更改某个文件夹中包含的图片的一些exif标签,并且我想在作业完成时使用输出来获取NAS(QNAP)上的通知。 一切都已经可以工作了,但是由于通知系统截断了消息,因此我只想收到我需要的信息,即shell输出的最后一行,例如以下内容:
Warning: [minor] Entries in IFD0 were out of sequence. Fixed. - 2015-07-12 15.41.06.jpg                                                                             
 4512 files failed condition                                                      
  177 image files updated

问题在于我现在只收到以下通知:

相机上的Exiftool cronjob已完成:4512个文件未通过条件

我希望得到的是:

相机上的Exiftool cronjob已完成:177张图片文件已更新

以下是脚本:

#!/bin/sh
# exiftool script for 2002 problem
dir="/share/Multimedia/Camera"
cd "$dir"
FOLDER="$(printf '%s\n' "${PWD##*/}")"
OUTPUT="$(exiftool -overwrite_original -r '-CreateDate<DateTimeOriginal' -if '$CreateDate eq "2002:12:08 12:00:00"' -if '$DateTimeOriginal ne $CreateDate' *.[Jj][Pp][Gg])"
/sbin/notice_log_tool -a "Exiftool cronjob completed on ${FOLDER}: ${OUTPUT}" --severity=5
exit 0
为了做到这一点,我使用“| tail -1”玩了一下$OUTPUT变量,但我可能犯了一些基本错误,导致我收到了类似如下的消息:

Exiftool cronjob completed on Camera: 4512 files failed condition | tail -1

请问怎样才能以正确的方式实现它?谢谢。
2个回答

97
将尾部放入捕获括号中。
OUTPUT=$(exif ... | tail -1)

这里不需要双引号。我猜你尝试过

OUTPUT="$(exif ...) | tail -1"

感谢您的回答。不幸的是,它似乎没有起作用,因为我现在收到了两个通知错误:“Exiftool cronjob completed on Camera: Syntax: exiftool [OPTIONS] FILE Consult the exiftool documentation for a full list of options.”和“Exiftool cronjob completed on Camera: 4689 files failed condition”。 - giopas
@giopas,“exif”无法判断它是否由子shell启动,因此对其使用没有任何影响。也许在同一时间引入了拼写错误?在脚本顶部放置“set -x”以启用日志记录,并将原始形式的“exif”命令与在命令替换中记录的命令进行比较。 - Charles Duffy

31

可能是一个旧帖子,但尝试使用 -n 标志 (参见 tail --help),并使用反引号包装命令输出。

OUTPUT=`exif ... | tail -n 1`

(user464502的答案对我无效,因为tail命令不认识参数“-1”)


4
当时,我在模仿原帖的语法。‘-n’是POSIX标准,并且更受欢迎。现代风格使用$(...)而不是反引号,虽然两者都可以。 - user464502
1
你可以[编辑]你的答案,而不仅仅是在评论中描述潜在的改进。 :) - Charles Duffy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接