bash脚本,循环不循环

时间:2014-03-13 06:43:04

标签: loops while-loop

我写了一个while循环来搜索文件内部并将输出附加到文本文件,但似乎它只读取该文本文件的第一行。我如何解决它 ?

while read line
do
x=`echo $line`
y=`grep $x: /etc/group | cut -d ":" -f 3`
grep $y /etc/passwd | cut -d ":" -f 1 >> users
grep $y /etc/group | cut -d ":" -f 4 | tr "," "\n" >> users
done < filename

2 个答案:

答案 0 :(得分:0)

也许您需要将$x$y括在引号中,否则grep可能会将第一个空格后的任何内容解释为要搜索的文件的名称:

#!/bin/bash                                                                                                                                    

while read line
do
    x=`echo $line`
    y=`grep "$x:" /etc/group | cut -d ":" -f 3`
    grep "$y" /etc/passwd | cut -d ":" -f 1 >> users
    grep "$y" /etc/group | cut -d ":" -f 4 | tr "," "\n" >> users
done < filename

答案 1 :(得分:0)

这可能会更安全,因为一些grep语句可能会拾取错误的字段(即它不会检查正确的字段):

while read GROUP
do
  GROUP_ID=`grep ^$GROUP: /etc/group | cut -d ":" -f 3`

  USER_ENT=`grep -e '\(.*:\)\{3\}'$GROUP_ID':' /etc/passwd`
  [ $? -eq 0 ] && cut -d ":" -f 1 <<<$USER_ENT

  GROUP_ENT=`grep -e '\(.*:\)\{2\}'$GROUP_ID':' /etc/group`
  [ $? -eq 0 ] && cut -d ":" -f 4 <<<$GROUP_ENT | tr "," "\n" | grep -v ^$

done < $FILE_NAME | sort | uniq >users