Cree una lista selecta de usuarios en Bash en OS X

Cree una lista selecta de usuarios en Bash en OS X

Estoy intentando crear un script de copia para copiar rápidamente una carpeta de usuario en OS X, excluyendo toda la basura (cachés, copias de seguridad de iPhone antiguos, registros, etc.). En cuanto a no copiar esos archivos/carpetas, no tengo ningún problema. El problema es a la hora de seleccionar el usuario. Quiero crear una lista de todos los usuarios de la computadora, excluyendo las cuentas del sistema, y ​​hacer que el operador elija de qué carpeta de usuario hacer una copia de seguridad simplemente escribiendo un número de una lista. Actualmente puedo obtener los usuarios con el siguiente comando:

userList=`dscl . list /Users UniqueID | awk '$2 >= 400 { print $1; }'`

Por ejemplo, esto devolverá:

hiddenadmin fred joe kim

Me gustaría crear una lista de selección que luego muestre:

Please choose which user folder you would like to copy:
  1) hiddenadmin
  2) fred
  3) joe
  4) kim

Una vez que tengo el usuario, estoy bien, pero parece que no puedo crear la lista. Además, no hay garantía de que los nombres sean los mismos, o incluso que la cantidad de usuarios sea la misma.

En caso de que se pregunte por qué no busco simplemente en la carpeta /Usuarios para crear la lista. Es posible que algunas cuentas estén ocultas y tengan su carpeta de usuario en otro lugar, y no quiero las carpetas Guesto Shareden la lista. El problema aquí es que ni siquiera sé por dónde empezar con este.

Respuesta1

Haymuchode formas de hacer lo que estás pidiendo. Aquí está mi opinión rápida y sucia.

Como ya tiene a sus usuarios en una variable, solo necesita un forbucle para formatear. Usaré tus valores para mi ejemplo:T

userList="hiddenadmin fred joe kim"
echo "Please choose which user folder you would like to copy:"
count=0
for name in $userList;do
  count=$((count+1))
  printf '\t%s) %s\n' $count $name
  echo
done
read -p "Choose from $(eval echo {1..$count}): " CHOICE

Este bucle leerá su userList, inicializará un contador y lo utilizará printfpara la salida. Sangrará \tsus selecciones y \nenviará un CRLF.

Una vez que se imprima su opción de menú, el readcomando solicitará al usuario que ingrese y establecerá su selección en la variable CHOICE. Puede reutilizar la countvariable dentro de la -popción de readpara mostrar opciones válidas. Tendrás que agregar algún código adicional para validar la entrada. Puedes hacerlo con una simple casedeclaración.

case $choice in 
  1) #some code
     ;;
  2) #some code
     ;;
  *) echo "Invalid choice"
     ;;
esac

información relacionada