Crie uma lista selecionada de usuários no Bash no OS X

Crie uma lista selecionada de usuários no Bash no OS X

Estou tentando criar um script de cópia para copiar rapidamente uma pasta de usuário no OS X, excluindo todo o lixo (caches, backups antigos do iPhone, logs, etc.). Quanto a não copiar esses arquivos/pastas, não estou tendo problemas. O problema está na hora de selecionar o usuário. Quero criar uma lista de todos os usuários no computador, excluindo contas do sistema, e fazer com que o operador escolha qual pasta de usuário deseja fazer backup, apenas digitando um número em uma lista. Atualmente posso obter os usuários com o seguinte comando:

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

Por exemplo, isso retornará:

hiddenadmin fred joe kim

Gostaria de criar uma lista de seleção que mostre:

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

Depois de ter o usuário, estou bem, mas não consigo criar a lista. Além disso, não há garantia de que os nomes seriam os mesmos, ou mesmo que o número de usuários seria o mesmo.

Caso você esteja se perguntando por que não procuro apenas na pasta /Users para criar a lista. Algumas contas podem estar ocultas e ter suas pastas de usuário em outro lugar, e não quero as pastas Guestou Sharedna lista. O problema aqui é que nem sei por onde começar.

Responder1

bastantede maneiras de fazer o que você está pedindo. Aqui está minha opinião rápida e suja.

Como você já tem seus usuários em uma variável, você só precisa de um forloop para fazer a formatação. Usarei seus valores no meu exemplo: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 loop irá ler seu userList, inicializar um contador e usá-lo printfpara a saída. O \tirá recuar suas seleções e \nenviará um CRLF.

Depois que sua opção de menu for impressa, o readcomando solicitará a entrada do usuário e definirá sua seleção para a variável CHOICE. Você pode reutilizar a countvariável na -popção de readexibir opções válidas. Você terá que adicionar algum código adicional para validar a entrada. Você pode fazer isso com uma casedeclaração simples.

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

informação relacionada