我有一个脚本,用于检查每个用户的主目录是否存在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 /”部分的方法。这样做的正确方法是什么?
答案 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'