Codice per l’analisi di una chiave / valore nel file dallo script di shell

Ho un file che ho bisogno di cercare un valore per chiave usando uno script di shell. Il file ha il seguente aspetto:

HereIsAKey This is the value 

Come posso fare qualcosa come:

 MyVar=Get HereIsAKey 

e quindi MyVar dovrebbe essere uguale a “Questo è il valore”. La chiave non ha spazi bianchi e il valore dovrebbe essere tutto ciò che segue lo spazio bianco dopo la chiave.

se HereIsAKey è univoco nel tuo file, prova questo con grep:

 myVar=$(grep -Po "(?<=^HereIsAKey ).*" file) 

Se hai solo bisogno di una variabile alla volta, puoi fare qualcosa del genere:

 #!/bin/bash cat file | while read key value; do echo $key echo $value done 

Il problema con questa soluzione: le variabili sono valide solo all’interno del ciclo. Quindi non provare a fare $key=$value e usarlo dopo il ciclo.

Aggiornamento: un altro modo è il reindirizzamento I / O:

 exec 3 

Se non si dispone di un grep che supporti le espressioni regolari compatibili con Perl, quanto segue sembra funzionare:

 VAR=$(grep "^$KEY " file | cut -d' ' -f2-) 

Se il file non è ordinato, le ricerche saranno lente:

 my_var=$( awk '/^HereIsAKey/ { $1=""; print $0; exit}' value-file ) 

Se il file è ordinato, puoi ottenere una ricerca più veloce con

 my_var=$( look HereIsAkey value-file | cut -d ' ' -f 2- ) 

Io uso un file di proprietà che è condiviso in più lingue, io uso un paio di funzioni:

 load_properties() { local aline= var= value= for file in config.properties; do [ -f $file ] || continue while read aline; do aline=${aline//\#*/} [[ -z $aline ]] && continue read var value <<<$aline [[ -z $var ]] && continue eval __property_$var=\"$value\" # You can remove the next line if you don't need them exported to subshells export __property_$var done <$file done } get_prop() { local var=$1 key=$2 eval $var=\"\$__property_$key\" } 

load_properties legge dal file config.properties popolando un insieme di variabili __property_... per ogni riga nel file, get_prop quindi consente l'impostazione di una variabile in base alle proprietà caricate. Funziona per la maggior parte dei casi che sono necessari.

Sì, mi rendo conto che c'è una valutazione qui, che rende non sicuro l'input dell'utente , ma funziona per quello che mi serviva.

 get () { while read -r key value; do if [ "$key" = "$1" ]; then echo "$value" return 0 fi done return 1 } 

Le due dichiarazioni di reso non sono strettamente necessarie, ma forniscono buoni codici di uscita per indicare il successo o l’insuccesso nel trovare la chiave fornita. Possono anche aiutare a distinguere tra “la chiave ha una stringa vuota per il valore” e “la chiave non è stata trovata”.