【问题标题】:Bash Scripting checking for home directoriesBash 脚本检查主目录
【发布时间】:2018-12-30 10:06:43
【问题描述】:

我正在尝试创建一个脚本来检查用户帐户是否具有有效的主目录。

这是我目前得到的:

#!/bin/bash

cat /etc/passwd | awk -F: '{print $1 " " $3 " " $6 }' | while read user userid directory; do
if [ $userid -ge 1000 ] && [ ! -d "$directory ]; then
echo ${user}
fi
done

这行得通。我得到了预期的输出,即具有无效主目录的帐户的用户名。

例如。输出

student1
student2

但是,我无法做到,只有当有效主目录没有问题并且所有目录都有效时,才回显“所有主目录都有效”。

【问题讨论】:

    标签: linux bash scripting


    【解决方案1】:

    没有运行,但应该是这样的:

    #!/bin/bash
    
    users=()
    cat /etc/passwd | awk -F: '{print $1 " " $3 " " $6 }' | while read user userid directory; do
    if [ $userid -ge 1000 ] && [ ! -d "$directory" ]; then
      users=+("${user}")
    fi
    done
    
    if test -n ${#users[@]} == 0; then
      echo "All home directories are valid"
    else
      for (( i=0; i<${#users[@]}; i++ )); do echo "${users[$i]}" ; done
    fi
    

    【讨论】:

      【解决方案2】:

      你可以设置一个标志,如果你看到一个无效的目录就取消它。或者你可以简单地检查你的循环是否打印了任何东西。

      您还需要避免一些常见的反模式。

      # Avoid useless use of cat
      # If you are using Awk anyway,
      # use it for user id comparison, too
      awk -F: '$3 >= 1000 {print $1, $6 }' /etc/passwd |
      # Basically always use read -r
      while read -r user directory; do
          # Fix missing close quote
          if [ ! -d "$directory" ]; then
              # Quote user
              echo "$user"
          fi
      done |
      # If no output, print default message
      grep '^' >&2 || echo "No invalid directories" >&2
      

      适当的工具将其诊断输出打印到标准错误,而不是标准输出,所以我在末尾添加了&gt;&amp;2

      【讨论】:

      • 你能进一步解释一下 grep '^' >&2 || echo "No invalid directory" >&2 like grep '^' and >&2... 我说 grep '^' 检查 if 语句是否有输出并且 >&2 输出标准错误是否正确
      • 是的,|| "or" 表示如果 grep 未能找到任何匹配项,请同时执行 echoif this; then that; else something; fi可以简写为this &amp;&amp; that || something,其中每个命令可以是任意复杂的复合命令;只有当命令很重要时,我们才倾向于使用速记 if; then; else; fi 以确保易读性。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 2014-09-19
      • 2011-05-11
      • 1970-01-01
      相关资源
      最近更新 更多