在这个bash脚本中获取用户列表的正确方法是什么?

时间:2017-12-08 11:11:57

标签: bash variables

我有一个脚本,用于检查每个用户的主目录是否存在maildir并相应地存档旧电子邮件。我这样做的方式基本上是这样的:

for USER in $(ls /home)
do
<function to check for maildir and remove old files>

我通过shellcheck运行了我的脚本并发出了警告

  

SC2045 - 迭代ls输出很脆弱。使用globs。

如果我将脚本更改为使用for USER in /home/*,则会更改$ USER:

的值
for USER in $(ls /home); do echo $USER ; done;

给出:

user1
user2
user3

但是

for USER in /home/*; do echo $USER ; done;

给出:

/home/user1
/home/user2
/home/user3

并在以后的地方打破我的脚本。

如果我开始为解析用户名的/ etc / passwd之类的东西,那么我需要检查它们是否有主目录等,这样会使脚本更复杂,以便遵循最佳实践。我无法找到从第二个示例中grep -v输出变量值的“/ home /”部分的方法。这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

您可以像这样使用account循环:

glob

cd /home for u in */; do echo "${u%/}" done cd - 仅列出目录。

答案 1 :(得分:1)

您可以使用grep的Perl模式grep -P,例如:

for USER in /home/*; do 
    echo $USER | grep -Po "(?<=/home/).*"
done

(?<=/home/)代表一个后视,不会被视为匹配的一部分,并且由于-o而不会被打印。这样做的好处是不需要你cd到主目录然后回来,而且grep -Po非常有用。

或者使用find(这也是一个非常有用的程序),你可以这样做:

find /home -mindepth 1 -maxdepth 1 -type d -printf '%f\n'