测试命令输出是否包含带“set -e”的字符串

时间:2017-11-21 22:19:29

标签: bash shell

我需要检查shell脚本中使用的RAM百分比。但我想使用“set -e”,这让我成为一个问题。

有两个版本的免费实用程序,输出略有不同。为了在输出上使用awk,我通过greting输出只出现在其中一个字符串中的字符串“buffers”来检查free命令中的哪一个。如果没有这样的字符串,则命令的退出状态= 1,由于set -e参数而导致我的脚本无法执行。

我尝试在grep命令之后添加“|| true”,但这总是设置退出代码= 0,使我的grep测试无用。

set -e
free -m | grep 'buffers' &> /dev/null || true
if [ $? == 0 ]; then
    MEMORY=$(free -m | awk 'NR==3{printf "%.0f%%", $3*100/($3+$4)}')
else
    MEMORY=$(free -m | awk 'NR==2{printf "%.0f%%", ($2-$7)*100/$2}')
fi
echo $MEMORY

那么如何在不关闭set -e参数的情况下正确地做到这一点?此外,还提出了任何更好的想法,以便将使用的RAM百分比变为变量。

1 个答案:

答案 0 :(得分:3)

如果将set -e移动到if,您可以避免因if free -m | grep 'buffers' &> /dev/null; then MEMORY=$(free -m | awk 'NR==3{printf "%.0f%%", $3*100/($3+$4)}') else MEMORY=$(free -m | awk 'NR==2{printf "%.0f%%", ($2-$7)*100/$2}') fi echo $MEMORY 而导致退出的失败命令:

free -m

此外,free=$(free -m) if [[ $free =~ buffers ]]; then MEMORY=$(awk 'NR==3{printf "%.0f%%", $3*100/($3+$4)}' <<< "$free") else MEMORY=$(awk 'NR==2{printf "%.0f%%", ($2-$7)*100/$2}' <<< "$free") fi echo $MEMORY 执行两次并不是很好。 您可以将其存储在变量中以便重复处理:

import json
data = json.load(open('jsonfile.json'))
clothing_ids = {'List of Clothing IDs': map(lambda x: x['ID'], data)}