Google
Web dns.bdat.net

Script que saca una lista de todos los usuarios que no tienen un directorio con su nombre en /home.

while read LINEA
do
        $usuario=$(echo $LINEA|cut -f1 -d:)
        if ! [ -f /home/usuario ]
        then
                echo $usuario
        fi
done </etc/passwd
            

Comentarios y recordatorio:

el operador $() de bash ejecuta una orden y devuelve su salida estándar. También se pueden usar comillas invertidas (`) para ejecutar una orden y obtener el resultado.

Cada línea la leemos del fichero /etc/passwd

cut -f1 -d: cortaría el campo uno ( -f 1) obtenido por un separador : de los valores de la entrada estándar, que es el resutl . Como el primer campo del fichero /etc/passwd es el nombre de usuario, entonces estaríamos obteniendo este nombre.

Caso general

La base de datos de usuarios no tiene por qué estar completa en el fichero /etc/passwd, puede estar sobre otros soportes como NIS, LDAP, Winbind, db, ... En consecuencia la forma de obtener la lista real de usuarios es ejecutar la orden "getent passwd", así como para obtener la lista de grupos ejecutamos "getent group".

En este caso, nuestro anterior script podría quedar como:

for LINEA in $(getent passwd)
do
        $usuario=$(echo $LINEA|cut -f1 -d:)
        if ! [ -f /home/usuario ]
        then
                echo $usuario
        fi
done
              

Corolario

Esta forma de obtener una parte de una cadena para almacenarla en una variable va a ser de uso frecuente en el desarrollo de scripts.