更正 bash 脚本中的测试,仅当找到的每个文件都满足指定的测试条件时才进行回显

更正 bash 脚本中的测试,仅当找到的每个文件都满足指定的测试条件时才进行回显
for x in $(ls -ll <path to files> | awk '{ print $3,$4 }' | tail -n +2) ; do 
  if [ "${x}" != "root" ] ; then
    echo "Fail"
    break
  else
    echo "Pass"
 fi
done

现在,它会为找到的每个文件打印“Pass”。我想打印“通过”如果全部文件的所有者是,并打印“失败”如果任何列表中的用户或组不是

答案1

如果你想查明你的所有文件是否都属于 root 并属于 root 组,请使用 find:

find <path to files> ! -user root -or ! -group root -print

如果返回任何内容,则该文件要么不属于 root,要么不属于组 root。然后,您可以将其放入条件子句中以打印出“通过”或“失败”。

[[ "$(find <path to files> ! -user root -or ! -group root -print)" == "" ]] && echo "Pass" || echo "Fail"

答案2

首先,您不应该解析 的输出ls及其变体。您可以使用以下方法来解决此问题stat

$ stat -c%U-%G ./*
tomasz-tomasz
tomasz-tomasz
tomasz-tomasz

正如您所看到的,结果是两个单词连接的可靠列表,您可以对其进行操作以获得所需的结果。将其放入循环中,然后就可以了:

PASS=true
for i in $(stat -c%U-%G ./*); do
    if ! [[ "$i" == root-root ]]; then
        PASS=false; break
    fi
done
if "$PASS"; then
    echo Pass
else
    echo Fail
fi

的值i需要使root-root循环在开关不变的情况下到达终点。

替换./*the_dir/*以测试另一个位置。

需要分隔-符,因为正如 Grump 在评论中指出的那样,如果文件属于“roo”并且位于“troot”组中,则字符串比较可能会失败,因此分隔符仍然是一件好事。

熟悉一下:为什么*不*解析`ls`(以及做什么来代替)?

答案3

怎么样

[ 1 = $({ echo root:root; stat -c"%U:%G" *; } | sort -u | wc -l) ] && echo PASS || echo FAIL

编辑: 或者

[ -z $(stat -c"%U:%G" * | grep -vm1 root:root) ] && echo PASS || echo FAIL

答案4

ls命令行中的输出是有风险的。我建议find在 shellscript 中用于此目的。

  • 参数find -printf中描述man find
  • 标准输出通过管道传送到grep,退出状态存储在 中norootfile
  • 输出也会写入临时文件,并对行数进行计数并存储在numfile(找到的文件数)中。
  • 您可以使用“verbose”选项-v从 shellscript 的输出中获取更多详细信息。

如果您还想搜索隐藏文件,请使用find .而不是find *

如果您不想在子目录中搜索,请-maxdepth 1在 find 命令行中使用。

#!/bin/bash

if [ "$1" == "-h" ]
then
 echo "Usage: $0 -h  # this help text"
 echo "       $0 -v  # verbose output"
 exit
fi

tmpfil=$(mktemp)

find * -xtype f -printf "%u:%g  %p\n" | tee "$tmpfil" | grep -v '^root:root' > /dev/null

norootsfile=$?
numfile=$(wc -l "$tmpfil")
#cat "$tmpfil"

if [ ${numfile%% *} -eq 0 ]
then
 echo "No file found; check the current directory"
elif [ $norootsfile -eq 0 ]
then
 echo "Fail"
 if [ "$1" == "-v" ]
 then
  echo "----- Found some file(s) not owned or grouped by root"
  echo "user:group file-name --------------------------------"
  grep -v '^root:root' "$tmpfil"
 fi
else
 echo "Pass"
 if [ "$1" == "-v" ]
 then
  echo "----- Found only files owned or grouped by root"
 fi
fi
rm "$tmpfil"

相关内容