在while循环bash脚本中读取文件

时间:2018-06-16 10:01:17

标签: bash shell loops ifs

我有这个代码,它读取/ etc / passwd的示例文件:

#!/bin/bash

OLDIFS=$IFS
IFS=$'\n'

while read linea resto
do
        echo $linea
        echo $resto
        if [[ $(echo $linea | cut -d: -f6 | egrep -c 'al-03-04') == 1 ]]
        then
                finger $(cut -d: -f1) 2> fich
                if [[ $(egrep -c fich) == 1 ]]
                then
                        echo $(echo $linea | cut -d: -f1). Inactive user
                else
                        echo $(echo $linea | cut -d: -f1). Active user
                fi
        fi
done < <(cat fichpasswd)

IFS=$OLDIFS

这是/ etc / passwd的示例文件:

jfer:x:5214:1007:Javier Lopez,,,:/home/al-03-04/jfer:/bin/bash
jperez:x:10912:1009:Juan Perez,,,:/home/al-03-04/jperez:/bin/bash
mfernan:x:10913:1009:Manuel Fernandez,,,:/home/al-02-03/mfernan:/bin/bash

问题是while循环只读取第一行,忽略其他行。脚本的输出是:

jfer:x:5214:1007:Javier Lopez,,,:/home/al-03-04/jfer:/bin/bash

jfer. Active user

1 个答案:

答案 0 :(得分:2)

您可以尝试以下方式:

#!/bin/bash

FILE="test.txt"

while IFS=":" read -a data; do
  echo "${data[@]}"
  if [[ $(echo ${data[5]}|egrep -c 'al-03-04') -eq 1 ]]; then
    if [[ $(finger "${data[0]}" 2>&1) =~ "no such user" ]]; then
      echo "${data[0]}. Inactive user"
    else
      echo "${data[0]}. Active user"
    fi
  fi
done < "$FILE"

这是输出:

ineumann ~ $ cat test.txt 
ineumann:x:5214:1007:Javier Lopez,,,:/home/al-03-04/jfer:/bin/bash
jperez:x:10912:1009:Juan Perez,,,:/home/al-03-04/jperez:/bin/bash
mfernan:x:10913:1009:Manuel Fernandez,,,:/home/al-02-03/mfernan:/bin/bash
ineumann ~ $ ./test.sh 
ineumann x 5214 1007 Javier Lopez,,, /home/al-03-04/jfer /bin/bash
ineumann. Active user
jperez x 10912 1009 Juan Perez,,, /home/al-03-04/jperez /bin/bash
jperez. Inactive user
mfernan x 10913 1009 Manuel Fernandez,,, /home/al-02-03/mfernan /bin/bash

对您的剧本的一些评论:

  • 无需使用cat来循环读取文件。
  • finger $(cut -d: -f1) 2> fichcut需要输入。并且不需要使用临时文件来捕获finger的输出(此外这不是线程安全的)。
  • 当您选择正确的cut分割多个部分的行时,无需在脚本中使用IFS。在您的情况下,我认为最明智的选择是:
  • 您只能使用语法IFS更改循环内的while IFS=':' read; do ...; done。无需使用IFS重新分配OLDIFS
  • 您还可以使用while IFS=':' read var1 var2 var3 trash; do ...; done语法来避免使用read -a的数组(但我更喜欢使用我在您的脚本版本中编写的数组)。< / LI>