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

Cal*_*och 2 bash shell-script

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
Run Code Online (Sandbox Code Playgroud)

现在,它会为找到的每个文件打印“Pass”。如果所有文件都归root拥有,我想打印“Pass”,如果列表中的任何用户或组不是root,则打印“Fail” 。

小智 6

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

find <path to files> ! -user root -or ! -group root -print
Run Code Online (Sandbox Code Playgroud)

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

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


小智 5

首先,您不应该解析 的输出ls及其变体。你可以使用stat

$ stat -c%U-%G ./*
tomasz-tomasz
tomasz-tomasz
tomasz-tomasz
Run Code Online (Sandbox Code Playgroud)

如您所见,结果是一个由两个单词连接而成的可靠列表,您可以对其进行操作以获得所需的结果。把它放到一个循环中,然后你去:

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
Run Code Online (Sandbox Code Playgroud)

的值i需要root-root使循环在开关不变的情况下结束。

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

-需要分离,因为,脾气坏的人在评论中指出,该字符串比较可能,如果该文件是由“袋鼠”和组“troot”拥有,所以失败的隔膜仍然会是一件好事。

熟悉这一点:为什么*不*解析`ls`(以及该怎么做)?