Script shell: assigne les sorties à différentes variables

Dans un script shell, je dois atsortingbuer la sortie de quelques valeurs à différentes variables, besoin d’aide s’il vous plaît.

cat file1.txt uid: user1 cn: User One employeenumber: 1234567 absJobAction: HIRED 

Je dois atsortingbuer la valeur de chaque atsortingbut à différentes variables pour pouvoir les appeler dans un script. Par exemple, uid doit être assigné à un nouveau nom de variable current_uid et lorsque $ current_uid est appelé, il doit indiquer user1, etc. pour tous les autres atsortingbuts.
Et si la sortie ne contient aucun des atsortingbuts, cette valeur d’atsortingbut doit être considérée comme “NULL”. Exemple si la sortie n’a pas absJobAction alors la valeur de $ absJobAction devrait être “NULL”


C’est ce que j’ai fait avec mon tableau

 #!/bin/bash IFS=$'\n' array=($(cat /tmp/file1.txt | egrep -i '^uid:|^cn:|^employeenumber|^absJobAction')) current_uid=`echo ${array[0]} | grep -w uid | awk -F ': ' '{print $2}'` current_cn=`echo ${array[1]} | grep -w cn | awk -F ': ' '{print $2}'` current_employeenumber=`echo ${array[2]} | grep -w employeenumber | awk -F ': ' '{print $2}'` current_absJobAction=`echo ${array[3]} | grep -w absJobAction | awk -F ': ' '{print $2}'` echo $current_uid echo $current_cn echo $current_employeenumber echo $current_absJobAction 

La sortie de sh /tmp/testscript.sh suit:

 user1 User One 1234567 HIRED 

 #!/usr/bin/env bash # assuming bash 4.0 or newer: create an associative array declare -A vars=( ) while IFS= read -r line; do ## See http://mywiki.wooledge.org/BashFAQ/001 if [[ $line = *": "* ]]; then ## skip lines not containing ": " key=${line%%": "*} ## ssortingp everything after ": " for key value=${line#*": "} ## ssortingp everything before ": " for value vars[$key]=$value else printf 'Skipping unrecognized line: <%s>\n' "$line" >&2 fi done &2 # extract and print a single variable by name echo "Variable uid has value ${vars[uid]}" 

Notez que ceci doit être exécuté avec bash yourscript , pas avec votre sh yourscript .


Au fait, si vous n’avez pas de bash 4.0, vous pourriez envisager une approche différente:

 while IFS= read -r line; do if [[ $line = *": "* ]]; then key=${line%%": "*} value=${line#*": "} printf -v "ldap_$key" %s "$value" fi done  

créera des variables séparées de la forme "$ldap_cn" ou "$ldap_uid" , par opposition à tout mettre dans un seul tableau associatif.

Voici un exemple simple de ce que vous essayez de faire qui devrait vous aider à démarrer. Il suppose 1 jeu de données dans le fichier. Bien que ce soit une force brute, je crois que c’est facile à comprendre.

Étant donné un fichier appelé file.txt dans le répertoire en cours avec le contenu suivant (absJobAction intentionnellement omis):

 $ cat file1.txt uid: user1 cn: User One employeenumber: 1234567 $ 

Ce script récupère chaque valeur dans une variable locale et l’imprime:

 # Use /bin/bash to run this script #!/bin/bash # Make SOURCEFILE a readonly variable. Make it uppercase to show its a constant. This is the file the LDAP values come from. typeset -r SOURCEFILE=./file1.txt # Each line sets a variable using awk. # -F is the field delimiter. It's a colon and a space. # Next is the value to look for. ^ matches the start of the line. # When the above is found, return the second field ($2) current_uid="$(awk -F': ' '/^uid/ {print $2}' ${SOURCEFILE})" current_cn="$(awk -F': ' '/^cn/ {print $2}' ${SOURCEFILE})" current_enbr="$(awk -F': ' '/^employeenumber/ {print $2}' ${SOURCEFILE})" current_absja="$(awk -F': ' '/^absJobAction/ {print $2}' ${SOURCEFILE})" # Print the contents of the variables. Note since absJobAction was not in the file, # it's value is NULL. echo "uid: ${current_uid}" echo "cn: ${current_cn}" echo "EmployeeNumber: ${current_enbr}" echo "absJobAction: ${current_absja}" ~ 

Quand exécuter:

 $ ./test.sh uid: user1 cn: User One EmployeeNumber: 1234567 absJobAction: $