用while循环读取行不返回所需的答案

时间:2014-08-21 17:07:26

标签: bash

示例:

文件list.txt:

$ cat list.txt

/apps
/log
/data

$ for i in `cat list.txt`; do
>   ls -ld $i | awk '{print $3}'
> done

appuser1
appuser2
appuser3

$ for i in `cat list.txt`; do
>   ls -ld $i | awk '{print $3}'
> done | while read -r line ; do
>   printf "%s For Filesystem $i "
>   getent passwd $line | awk -F: '{print $5}'
> done

For Filesystem /data owner=User1
For Filesystem /data owner=User2
For Filesystem /data owner=User3

期望的结果应该是:

For Filesystem /apps owner=User1
For Filesystem /log owner=User2
For Filesystem /data owner=User3

实际上,list.txt文件是一个非常长的命令,它解析每个服务器上的/ proc / mounts文件,并且需要将此列表重定向到。

1 个答案:

答案 0 :(得分:2)

我建议您将脚本更改为以下内容:

while read -r line; do 
    owner=$(stat -c"%U" "$line")
    echo "For Filesystem $line owner=$owner"
done < list.txt

while read循环一次读取list.txt一行。 stat用于提供有关文件或目录的信息。 -c开关允许您为输出指定格式字符串。 %U是所有者的用户名。

一般情况下,您不应该解析ls,在这种情况下不必使用cat

在回复你的评论时,如果不是使用文件,你想传递另一个进程的输出,你可以这样做:

while read -r line; do 
    owner=$(stat -c"%U" "$line")
    echo "For Filesystem $line owner=$owner"
done < <(awk '{print $2}' /proc/mounts)

无需将其他命令的输出存储在变量中。如果您想要使用变量,您可以使用:

filesystems=$(awk '...' /proc/mounts)
在循环之前

,然后是:

done <<<"$filesystems"        # less portable (works on bash)

或:

done < <(echo "$filesystems") # extra process, slightly longer