如何在shell中验证命令的输出?

时间:2016-06-22 06:00:05

标签: linux bash shell

我需要验证特定文件系统是否设置了 noexec 选项。

例如/dev/shm。我按以下方式运行命令:

get_val=$(mount|grep /dev/shm )
if [[ -z get_val ]] ; then
   # Error
else
   value=$(echo "${get_val}" | cut -d " " -f 6 | grep noexec)
   if [ "${value}" = "" ]; then
     # Not set
   else
     # Set
    fi
fi

get_val的值类似于devshm on /dev/shm type devshm (rw,noexec,nosuid,gid=5,mode=0620)

接下来我要做的是检查gidmode是否已设置为某个值。但是,通过上述步骤,我只能检查是否设置了选项。

所以我尝试了这个:

echo "${get_val}"| cut -d " " -f 6 | awk -F, '{
if ($4 == "gid=123"){
print 1;
}
else
{ print 0;}
if ($5 == "mode=123)"){
print 1;
}
else
{ print 0;}'

然而,这似乎太麻烦了,我不确定这样做的最好方法是什么。

还可以在文件系统中设置其他参数,例如nodev等,这将使$ 5或$ 2不同。

有什么建议吗?

3 个答案:

答案 0 :(得分:1)

看起来你真的应该转向Awk,即使是基本处理。

if mount | awk '$1 == "/dev/shm" && $6 ~ /(^|,)noexec(,|$)/ &&
    $6 ~ /(^|,)gid=123(,|$)/ && $6 ~ /(^|,)mode=123(,|$)/ { exit 0 }
  END { exit 1 }'
then
    echo fine
else
    echo fail
fi

(^|,)(,|$)锚点是为了确保匹配可以用逗号或字段的开头/结尾括起来,以避免部分匹配(例如mode=1234)。

让Awk设置其返回代码,以便在if条件下以惯用方式使用它有点麻烦,但这是一个很好的总体思路。

答案 1 :(得分:0)

为什么不直接对[[使用globbing:

[[ ${get_val} == *\(*gid=5*\)* ]] && echo 'Matched'

同样,使用“mode = 0620”:

[[ ${get_val} == *\(*mode=0620*\)* ]] && echo 'Matched'

如果您更喜欢Regex方式:

[[ ${get_val} =~ \(.*gid=5.*\) ]] && echo 'Matched'
[[ ${get_val} =~ \(.*mode=0620.*\) ]] && echo 'Matched'

答案 2 :(得分:0)

很抱歉,如果这是愚蠢的,但不像

那么简单
mount | grep -E '^/dev/shm.*noexec' && value=1
((value)) && #Do something useful

如果您想检查多个字段,可以像下面一样管道grep:

mount | grep -E '^/dev/shm.*noexec' \
| grep -E 'gid=5.*mode=0620|mode=0620.*gid=5' >/dev/null && value=1

((value==1)) && #Do something useful