2015-11-02 10 views
6

Durante la scrittura di script bash mi piace scrivere funzioni autonome che accettano un argomento ed eseguono operazioni basate su quell'argomento/i piuttosto che avere variabili globali dichiarate in diversi punti diversi il codice diminuisce la leggibilità.Elenco di tutte le variabili in un file in bash

Il problema sorge quando si dispone di una funzione che deve utilizzare diverse variabili. Passare qualcosa come 10 variabili a una funzione è semplicemente brutto e per questo può essere usato un semplice array associativo.

Se vogliamo dichiarare le variabili in un file esterno, il comando "fonte" consente di importare tutti in.

La questione diventa allora, come faccio a elencare le variabili dichiarate solo dentro questo file in modo Posso costruire il mio array associativo con loro? Sono stato in grado di utilizzare una combinazione di "compgen" e un ciclo per creare array associativi da un elenco di variabili ma come si elencano solo le variabili trovate all'interno del file, indipendentemente da come vengono chiamate, così posso fare il ciclo attraverso di loro e costruire il mio array?

+1

avrei tendo a suggerire utilizzando un formato facile da analizzare commento per la documentazione (come fatto per doxygen, javadoc, e gli strumenti derivati). –

+1

È sempre possibile confrontare l'output di 'declare' /' set' prima e dopo l'acquisizione del file di configurazione? =) Oppure, se il file di configurazione è unico per tale funzione, crea direttamente l'array. E se non è univoco per la funzione, allora hai bisogno di un modo per usare comunque solo le variabili corrette, quindi scrivi semplicemente una funzione "collect_args" che prende i nomi delle variabili che la funzione si aspetta, ecc. –

+0

Grazie. @EtanReisner Penso che il tuo suggerimento potrebbe essere necessario, in quanto sembra che non riesca a trovare una soluzione migliore se non analizzare il file attuale – ByteFlinger

risposta

0

Potresti fare un egrep per qualche variabile dichiarare sintassi sul file e quindi ottenere il nome della variabile tagliandolo, per esempio come questo:

egrep '[a-zA-Z0-9"'\''\[\]]*=' /path/to/file |egrep -v '^#' |cut -d'=' -f1 |awk '{print $1}' 

Se si ha un file con contenuti simili questo

#!/bin/bash 

A="test" 

somerandomfunction() { 
     echo "test function" 
     B="test" 
} 

#C="test" 

DEF="test" 
GHI1="test" 
JKL[1]="test" 
JKL['a']="test" 
JKL["b"]="test" 

l'output del comando di cui sopra sarebbe simile a questa:

A 
B 
DEF 
GHI1 
JKL[1] 
JKL['a'] 
JKL["b"] 

Descrizione dei comandi:

  1. Le prime ricerche egrep per linee contenenti qualsiasi numero e combinazione di minuscole (a-z) e/o maiuscole (A-Z) lettere e/o parentesi quadre (\[\]) e/o singolo ('\'') e/o doppio (") virgolette seguite da un =.
  2. Il secondo egrep esclude le righe che iniziano con un # poiché solitamente vengono interpretate come commenti e non generano né impostano una variabile.
  3. Il comando di taglio taglia tutto, dallo = alla fine della riga.
  4. Il comando awk stampa la prima occorrenza di qualcos'altro rispetto a spazi o tabulazioni e pertanto elimina efficacemente lo spazio vuoto davanti ai nomi delle variabili.

L'output del comando potrebbe essere utilizzato in un loop o qualcosa di simile:

for VAR in $(egrep '[a-zA-Z0-9"'\''\[\]]*=' /path/to/file |egrep -v '^#' |cut -d'=' -f1 |awk '{print $1}'); do 
    eval echo "\$${VAR}" 
done 
+0

Di solito uso solo lettere maiuscole e numeri per i nomi delle variabili, per mantenere il mio codice leggibile. :) – David

+1

Grazie. Lo esaminerò appena possibile. – ByteFlinger

0

questo è un modo utilizzando awk

egrep "* =" File | awk 'BEGIN {FS = "="} {print $ 1}' | grep -v "#" | colonna -t

Spiegazione: Poiché le variabili avranno "=" per l'assegnazione di valori, utilizzando a come un modello grep il "* =" dal file. una volta fatto, sto usando awk per dichiarare il separatore Field come "=" e stampando qualsiasi cosa prima di usare $ 1. La colonna -t serve solo per allineare l'output a sinistra.

Spero che aiuti.

+0

grep -v "#" serve per escludere variabili commentate. questo può essere ignorato se vuoi che anche le variabili commentate vengano stampate –

0

Che dire ottenere le variabili direttamente dal file?

VARLIST=$(cut -d= -f1 file_with_variables)