Bash-捕获命令的输出
我试图检查命令的输出,并根据输出运行不同的命令Bash-捕获命令的输出,bash,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")" medi
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”atom,则输出如下所示:
$ mediainfo FILE | grep "©xyz" | head -n 1
$ ©xyz : +60.9613-125.9309/
$
否则为空
$ mediainfo FILE | grep "©xyz" | head -n 1
$
上述代码不起作用,即使出现©xyz,也会回显警告。
知道我做错了什么吗?
$?
是命令的退出代码:一个介于0和255之间的数字。它与stdout无关,在stdout中写入值“xyz”
要在标准输出中匹配,您可以使用grep
:
if mediainfo "${BASE}_${suffix}_${suffix2}.mp4" | grep -q "©xyz"
then
echo "It contained that thing"
else
echo "It did not"
fi
您使用的
mediainfo
命令的捕获输出语法完全错误。使用grep
时,可以直接在if条件中使用其返回代码(输出$?
)
if mediainfo "${BASE}_${suffix}_${suffix2}.mp4" | grep -q "©xyz" 2> /dev/null;
then
..
grep
中的-q
标志指示它以静默方式运行命令,而不会将任何结果抛出到stdout
,而2>/dev/null
部分会抑制通过stderr
抛出的任何错误,因此当字符串存在时,您将获得if条件传递,如果字符串不存在,则获得失败