Bash - 捕获命令

时间:2017-04-07 17:08:37

标签: bash

我正在尝试检查命令的输出并根据输出运行不同的命令。

count="1"
for f in "$@"; do
   BASE=${f%.*}
#    if [ -e "${BASE}_${suffix}_${suffix2}.mp4" ]; then
    echo -e "Reading GPS metadata using MediaInfo file ${count}/${#@} "$(basename "${BASE}_${suffix}_${suffix2}.mp4")"
   mediainfo "${BASE}_${suffix}_${suffix2}.mp4" | grep "©xyz" | head -n 1
    if [[ $? != *xyz* ]]; then
    echo -e "WARNING!!! No GPS information found! File ${count}/${#@} "$(basename "${BASE}_${suffix}_${suffix2}.mp4")" || exit 1
    fi
    ((count++))
done

MediaInfo是我正在检查输出的命令。 如果视频文件中写入了“©xyz”原子,则输出如下所示:

$ mediainfo FILE | grep "©xyz" | head -n 1
$ ©xyz                                     : +60.9613-125.9309/
$

否则为空

$ mediainfo FILE | grep "©xyz" | head -n 1
$

上述代码无法正常工作,即使在©xyz出现时也会发出警告。 对我做错了什么想法?

2 个答案:

答案 0 :(得分:1)

您使用捕获mediainfo命令输出的语法是完全错误的。使用grep时,您可以直接在if条件

中使用其返回码($?的输出)
if mediainfo "${BASE}_${suffix}_${suffix2}.mp4" | grep -q "©xyz" 2> /dev/null; 
then
..

-q中的grep标志指示它以静默方式运行命令而不将任何结果抛给stdout,而2>/dev/null部分则禁止通过{{1}引发的任何错误因此,当字符串存在时,您将获得if条件传递,如果不存在,则获得stderr

答案 1 :(得分:0)

$?是命令的退出代码:0到255之间的数字。它与stdout无关,你的值是" xyz"是写的。

要在stdout中匹配,您只需使用grep

if mediainfo "${BASE}_${suffix}_${suffix2}.mp4" | grep -q "©xyz"
then
  echo "It contained that thing"
else
  echo "It did not"
fi