Quería crear una variable para cada línea grep regex del archivo Usernames.txt. El texto contiene este
mario,visitor bobmarley,staff luigi,visitor hailey,visitory así.
Quiero el nombre antes de la coma como nombre de usuario y el visitante como grupo para el usuario
#!/bin/bash sudo addgroup visitor sudo addgroup staff filename='Usernames.txt' while read line; do username=$(echo $line | grep -o '^[az]*[^,]') group=$(echo $line | grep -o '[^,][az]*$') sudo useradd $username -G $group -p $username done < $filenamepero la salida dice que no se encontró el nombre de usuario del comando. Entonces, en cambio, probé un método no tan eficiente
while read line; do sudo useradd $(echo $line | grep -o '^[az]*[^,]') -G $(echo $line | grep -o '[^,][az]*$') -p $(echo $line | grep -o '^[az]*[^,]') done < $filenameQuiero que el resultado de cada ciclo sea así.
sudo useradd mario -G visitor -p mario¿Cómo mejoro esto? ¡Gracias!
La bifurcación de múltiples procesos (por ejemplo, grep ) en cada iteración de bucle es una mala idea en general. Además, la división de palabras simple se puede hacer directamente en Bash, sin ningún proceso externo.
Opción 1:
while IFS= read -r line; do username="${line%,*}" group="${line#*,}" echo sudo useradd "$username" -G "$group" -p "$username" done < "$filename"Opcion 2:
while IFS=, read -r username group; do echo sudo useradd "$username" -G "$group" -p "$username" done < "$filename"Pruebe este enfoque
while read -r name role; do sudo useradd $name -G $role -p $name done < <(sed 's/,/ /' $filename) En realidad sed es suficiente:
sudo sed 's/\(.*\),\(.*\)/useradd \1 -G \2 -p \1/e' $filename