Che cos'è una shell e perché è necessaria
La shell dei comandi su qualsiasi sistema simile a unix, che include GNU / Linux, è un programma normale che viene eseguito sia in una console di testo (che viene utilizzata sempre meno) sia in un ambiente grafico - in una finestra dell'emulatore di terminale disponibile su qualsiasi sistema Linux .
Il suo compito è semplice e ovvio: accettare una linea (o linee) di input, analizzarle e, sulla base dei risultati di questa analisi, reagire di conseguenza - eseguire un comando, eseguire un programma, visualizzare un messaggio diagnostico, ecc.
In quasi tutti distribuzioni Linux bash è la shell predefinita per gli utenti (Bourne Again SHell è un'altra shell di comandi Burn; Steve Burn è l'autore della prima shell Unix - sh). In effetti, è diventata uno standard non ufficiale e un miglioramento per lei funzionalità continua continuamente. Esistono altre shell di comandi: tcsh (versione C-shell), ksh (Korn Shell), zsh, ecc. - ognuno ha i suoi vantaggi e svantaggi, così come i suoi gruppi di fan. Tuttavia, bash è più familiare alle grandi masse di utenti con diversi livelli di formazione, ecco perché ho optato per questo. Vale anche la pena notare che, indipendentemente dalle capacità possedute da varie conchiglie, sono tutte compatibili con il loro progenitore ideologico - Bourn Shell (sh). In altre parole, lo script scritto per sh funzionerà correttamente in qualsiasi shell moderna (il contrario, in generale, non è corretto).
Vantaggi della riga di comando
Potrebbe sorgere la domanda: perché preoccuparsi della riga di comando se esistono interfacce grafiche comode e belle? Ci sono molte ragioni per questo. Innanzitutto, non tutte le operazioni sono più convenienti e più veloci da eseguire utilizzando l'interfaccia grafica. In secondo luogo, ogni programma segue il principio fondamentale dei sistemi Unix: fare un lavoro ben definito e farlo bene. In altre parole, capisci sempre cosa succede quando esegui una particolare utility (se qualcosa non è del tutto chiaro, allora dovresti fare riferimento al manuale man). In terzo luogo, padroneggiando il team, provando le loro combinazioni e combinazioni dei loro parametri, l'utente impara il sistema, acquisendo preziosa esperienza pratica. È possibile accedere a strumenti efficaci come pipeline che consentono di organizzare una catena di comandi per l'elaborazione dei dati, strumenti di reindirizzamento input / output e inoltre, è possibile programmare direttamente nella shell dei comandi. Forse vale la pena soffermarsi sulla programmazione in modo più dettagliato, soprattutto perché molti script di sistema in Linux (ad esempio, script per l'avvio di servizi di sistema) sono scritti per la shell.
Shell come linguaggio di programmazione
Pertanto, la shell dei comandi può essere considerata come un linguaggio di programmazione e contemporaneamente come un runtime software. Naturalmente, questo linguaggio non è compilato, ma interpretato. Permette l'uso di variabili: sistema o il tuo. La sequenza di esecuzione dei comandi del programma viene modificata usando le condizioni che controllano i costrutti e selezionando l'opzione appropriata: if-then-else e case. Mentre, fino a quando e per i cicli automatizzano più azioni ripetute. È possibile combinare gruppi di comandi in blocchi logici. Puoi persino scrivere funzioni reali passando loro i parametri. Pertanto, ci sono tutti i segni e le caratteristiche di un linguaggio di programmazione completo. Proviamo a trarne doppio vantaggio: insieme all'apprendimento delle basi della programmazione, automatizziamo il nostro lavoro quotidiano.
Ciao mondo! Sistema di backup semplice
Sulla necessità di regolare prenota copia tutti conoscono i dati, ma gli utenti non hanno sempre tempo per questa noiosa operazione. La soluzione è semplice: organizza i backup automatici. Questa sarà la nostra prima attività di programmazione nella shell.
#! / bin / bash # # Backup di directory e file dalla directory home # Questo script di comando può essere eseguito automaticamente utilizzando cron # cd $ HOME se [! -d archives] quindi mkdir archives fi cur_date \u003d `date +% Y% m% d% H% M` se [$ # -eq 0]; quindi tar czf archive $ (cur_date) .tar.gz progetti bin altro tar czf archive $ (cur_date) .tar.gz $ * fi if [$? \u003d 0]; quindi mv archive $ (cur_date) .tar.gz $ HOME / archives echo "$ cur_date - Backup completato con successo." else echo "$ cur_date - ERROR durante il backup." fiQualsiasi script di comando (script - uno script, il cosiddetto programma shell) inizia con una riga identificativa in cui l'interprete dei comandi viene esplicitamente specificato con il percorso completo. Il percorso completo è un elenco sequenziale di tutte le directory, a partire dalla directory principale, che deve essere immessa per raggiungere il file di destinazione e, ovviamente, il nome di questo file. La registrazione del percorso completo è estremamente importante per identificare in modo univoco ciascun file nella gerarchia del file system.
Seguono quattro righe di commenti. Non appena la shell incontra il carattere "#", considera tutti i caratteri successivi come commenti e li ignora completamente fino alla fine della riga corrente. Pertanto, è possibile iniziare il commento non dall'inizio della riga, ma accompagnarli con qualsiasi comando.
Dopo i commenti c'è una riga vuota. Per la shell, non significa nulla e non viene intrapresa alcuna azione. Negli script, le righe vuote vengono generalmente inserite per rendere leggibile il codice.
Finalmente siamo arrivati \u200b\u200balla prima squadra "reale". Ti consente di cambiare la directory (Cambia directory), ad es. passa dalla directory corrente a un'altra, passata al comando come argomento. Nella maggior parte dei casi, la directory di destinazione viene specificata in modo esplicito, ad esempio progetti cd / tmp o cd, ma nel nostro caso viene utilizzata la variabile di sistema predefinita HOME - contiene il percorso completo della directory home dell'utente corrente, per conto del quale viene eseguito lo script di comando. Pertanto, ci liberiamo della necessità di apportare modifiche al codice ogni volta che cambiamo l'utente, poiché il comando restituisce chiunque alla sua directory personale. Il simbolo del dollaro "$" davanti al nome della variabile significa che è necessario estrarre il valore contenuto in questa variabile e sostituirlo nella riga di comando anziché nel nome. Va notato in particolare che nel linguaggio dei comandi le shell dei casi di lettere sono importanti, ad es. HOME, Home e Home sono tre variabili diverse. Per convenzione, le lettere maiuscole indicano i nomi delle variabili di sistema: HOME, PATH, EDITOR, ecc. Questo accordo non proibisce agli utenti di creare le proprie variabili con nomi in maiuscolo, ma perché complicare la propria vita violando le norme e le regole generalmente accettate? Inoltre, non è consigliabile modificare i valori delle variabili di sistema a meno che non sia assolutamente necessario. In generale, seguiamo una semplice regola: usiamo le variabili di sistema per la sola lettura e, se ne abbiamo bisogno, scriviamo il suo nome in lettere minuscole.
Il nostro primo comando potrebbe essere scritto più brevemente:
cd ~Qui, il simbolo "~" indica anche la home directory dell'utente corrente. I veterani della riga di comando sono ancora più concisi:
CDIl punto è che quando non viene fornito alcun argomento per il comando cd, si passa alla home directory.
Il prossimo passo è il classico design del software per verificare le condizioni e prendere una decisione appropriata. Lo schema generale è il seguente:
Se<условие> poi<одна или несколько команд> fiL'ultima parola della costruzione (se nell'ordine inverso) funge da parentesi di chiusura, ovvero i limiti dell'elenco di comandi eseguiti se la condizione è vera. La presenza di fi è obbligatoria, anche se è elencata solo una squadra.
Per verificare la condizione, di norma, utilizzare il comando test o la sua forma alternativa di scrittura tra parentesi quadre. In altre parole, record
Se [! -d archivi] se prova! -d archiviassolutamente equivalente. preferisco parentesi quadre, poiché definiscono più chiaramente i limiti della condizione da verificare. Le parentesi destra e sinistra devono essere separate dalla condizione da spazi.
I criteri per il controllo delle condizioni sono determinati da una varietà di bandiere. Il comando test ne riconosce un elenco molto ampio. Nel nostro esempio, è stato utilizzato il flag -d, che ci consente di verificare se il nome dato dopo il flag corrisponde a una directory reale esistente. I flag più comuni utilizzati quando si lavora con i file sono:
F: esiste un file regolare con il nome indicato;
R - se il diritto di leggere da esso è impostato per il file dato;
W - se il diritto di scrivere su di esso è impostato per il file dato;
X - se il diritto di eseguirlo è impostato per il file specificato;
S - se il file specificato ha una dimensione diversa da zero.
Nel nostro caso, la condizione si trova di fronte a un punto esclamativo che indica l'operazione di negazione logica, quindi il significato della condizione da testare diventa completamente opposto. Proviamo a scrivere il significato di questi comandi nel normale russo:
Se [! -d archives] Se la directory archives (nella directory corrente) non esiste, quindi iniziare a eseguire il blocco comandi: mkdir archives crea la directory archives (nella directory corrente) e termina il blocco comandi.Come puoi vedere, tutto si è rivelato non così complicato. Un po 'di pratica e puoi facilmente leggere e creare tali disegni da solo. Il comando di creazione del catalogo è così ovvio che non sono necessarie ulteriori spiegazioni.
Nella riga successiva, creiamo la nostra variabile locale cur_date. Nella stragrande maggioranza dei casi, le variabili vengono create semplicemente assegnando un valore specifico, ad esempio:
ten \u003d 10 string \u003d "Questa è una riga di testo"Ma nel nostro esempio, viene utilizzato un piccolo trucco. Si noti che dopo il segno di uguale - il simbolo di assegnazione - il comando è scritto tra virgolette. Questa forma di registrazione ci consente di assegnare alla variabile non la stringa stessa, ma il risultato della sua esecuzione. Ecco l'output del comando date, che restituisce la data e l'ora correnti nel formato definito dall'elenco dei parametri:
% Y - anno corrente in modulo completo, cioè quattro cifre (ad es. 2009);
% m - numero del mese corrente (ad esempio, 09 - per settembre);
% d - numero del giorno corrente;
% H: ora corrente nel formato 24 ore;
% M - minuto corrente.
Pertanto, se si esegue il comando
cur_date \u003d `data +% Y% m% d% H% M`10 settembre 2009 alle 22:45, alla variabile cur_date verrà assegnato il valore di stringa "200909102245". Lo scopo di questo trucco è quello di creare un nome file di archivio unico e non duplicato. Se si intende eseguire diverse istanze del programma in un minuto, è possibile migliorare l'unicità dei nomi aggiungendo i secondi correnti. Come? Controlla il manuale dell'utilità date (man date) - non c'è nulla di complicato.
Prima di iniziare a creare un file di archivio, è necessario determinare quali directory verranno memorizzate in esso. Per una maggiore flessibilità, è possibile specificare un set di directory da archiviare per impostazione predefinita, ma fornire la possibilità di sostituire questo set con un elenco di directory, passato come argomento al nostro script di comando. Per questo, vengono utilizzate speciali variabili di shell: $ # - il numero di parametri passati allo script e $ * - tutti i parametri trasferiti scritti in un formato a riga singola.
if [$ # -eq 0]; poiControllando la condizione "se il numero di parametri passati è zero", quindi eseguire il comando seguente. Si noti che la parola chiave then può essere scritta nella riga delle condizioni, separandola dall'espressione condizionale con un punto e virgola.
tar czf archive $ (cur_date) .tar.gz bin progettiComando per creare un file di archivio e comprimere questo file. L'utilità tar stessa non esegue la compressione, ma raccoglie solo tutti i file e le directory specificati in un singolo file tar. Il primo flag è destinato a questo - c (create - per creare). La compressione viene eseguita da un programma esterno - qui è gzip, chiamato dal secondo flag - z. Se nel tuo sistema è installato un programma di compressione bzip2 più efficiente, puoi usarlo modificando il comando come segue:
tar cjf archive $ (cur_date) .tar.bz2 bin progettiIl terzo flag f indica che segue il nome del file di archivio, quindi è sempre in coda nell'elenco dei flag. Si noti che durante la sostituzione, il nome della variabile è racchiuso tra parentesi graffe. Questo viene fatto per evidenziare esplicitamente la variabile nella linea che la circonda, eliminando così molti potenziali problemi. Le estensioni al file di archivio non vengono assegnate automaticamente, tu stesso aggiungi tutto ciò di cui hai bisogno. Come directory archiviate per impostazione predefinita, ho specificato progetti e bin, ma puoi scrivere qui i nomi delle tue directory più preziose.
La parola chiave else apre un ramo di esecuzione alternativo. I comandi di questo blocco iniziano a funzionare se il controllo della condizione dà il risultato "falso" (nel nostro esempio: "il numero di parametri passati è diverso da zero", ovvero l'utente ha specificato i nomi delle directory). In questo caso, il comando sarà simile al seguente:
tar czf archive $ (cur_date) .tar.gz $ *Qui, le directory vengono sostituite per impostazione predefinita con una stringa di nomi di directory accettata dall'esterno. È possibile accettare ed elaborare singolarmente ogni parametro esterno, ma è più conveniente per noi passare l'intera stringa.
Alla fine del programma, viene eseguito un altro controllo. In ambienti unix, tutti i comandi restituiscono un codice di stato di completamento. Se il comando ha funzionato correttamente, restituisce il codice 0, altrimenti il \u200b\u200bcodice di completamento sarà diverso da zero. Per verificare il successo del precedente comando di archiviazione, utilizziamo un'altra variabile speciale, $ ?, che contiene sempre il valore del codice di completamento del comando più recente. Se nella variabile $? contiene 0, ad es. Il file di backup è stato creato correttamente, quindi lo spostiamo nella directory di archivio:
mv archive $ (cur_date) .tar.gz $ HOME / archivied emettere il messaggio appropriato:
echo "$ cur_date - Backup completato con successo."Se il controllo ha mostrato che il codice per completare l'operazione di archiviazione non è uguale a zero, viene visualizzato un messaggio di errore:
echo "$ cur_date - ERROR durante il backup."Questo completa il lavoro del nostro team script.
Per verificare il funzionamento del nostro programma, è necessario salvare quanto sopra fonte in un file, ad esempio, con il nome bckp, e quindi per comodità renderlo eseguibile:
chmod 750 bckpe corri:
./bckpper eseguire il backup delle directory predefinite e
./bckp docs progs funzionaper creare una copia di backup delle directory elencate (specificare i nomi delle directory effettivamente presenti sul proprio sistema, altrimenti si riceverà un messaggio di errore).
È possibile posizionare il file bckp in una delle directory specificate nella variabile di sistema PATH. I posizionamenti più preferiti sono / usr / local / bin o $ HOME / bin, se ne hai. Successivamente, è possibile eseguire bckp come comando di sistema.
Come automatizzare le operazioni di backup pianificate
Qualche parola sull'automazione del backup. A tale scopo viene utilizzato lo scheduler di sistema cron, che legge le istruzioni di lavoro da un file crontab speciale. Per definire tali istruzioni, è necessario creare e modificare il file crontab usando il comando:
crontab -eLe istruzioni sono scritte in un formato rigorosamente definito (i campi sono separati da spazi):
minuti ore day_month month day_week teamUna delle opzioni per la pianificazione delle operazioni di backup potrebbe essere simile alla seguente:
30 23 10,20,30 * * / usr / local / bin / bckpCiò significa che lo script di backup (deve essere specificato il percorso completo di questo file) verrà eseguito alle 23:30 del 10, 20 e 30 di ogni mese, indipendentemente dal giorno della settimana. (Gli asterischi indicano l'intero intervallo accettabile di valori, in questo caso: ogni mese nel 4 ° campo, ogni giorno della settimana nel 5 ° campo)
Se si preferisce eseguire il riepilogo per settimane e il sistema funziona 24 ore su 24, ha senso pianificare i backup in ore con un carico minimo:
0 5 * * 3.5 / usr / local / bin / bckpQui backup verrà creato alle 5:00 di mercoledì e venerdì di ogni mese (asterisco nel 4o campo), indipendentemente dal numero (asterisco nel 3o campo).
Puoi leggere tutte le complessità della pianificazione nel manuale di crontab man 5.
Sommario e conclusioni
Lo script di backup discusso in questo articolo ha proprietà funzionali modeste. Ma questo non era il suo compito principale, ma il lettore capiva cosa si potesse fare riga di comandoe non solo ha copiato ed eseguito il file batch proposto, ma si è interessato ad espandere le sue funzioni, impegnato nell'esplorazione delle immense possibilità fornite dalle shell dei comandi. E se qualcuno, dopo aver letto questo articolo, cerca di migliorare il codice fornito qui, o scrive la propria versione o implementa la sua idea indipendente, allora considererò che l'obiettivo principale è stato raggiunto.
Scarica risorse
static.content.url \u003d http: //www.site/developerworks/js/artrating/
ArticleID \u003d 458335
ArticleTitle \u003d Fondamenti di programmazione Shell
- lezione
Nozioni di base di BASH. Parte 2.
Mi scuso per un ritardo così grande tra gli articoli, ma la sessione si fa sentire nel momento più inopportuno :)
Grazie a tutti per i commenti, le critiche e le aggiunte che sono state espresse nei commenti sull'articolo precedente.
Questa parte, come promesso, sarà dedicata ai cicli, alle operazioni matematiche e all'uso di comandi esterni.
Iniziamo.
Cicli. Ciclo for-in
L'operatore for-in viene utilizzato per accedere uno alla volta ai valori elencati nell'elenco. Ogni valore nell'elenco è assegnato a una variabile.La sintassi è la seguente:
per variabile in value_list
fare
squadre
fatto
Considera un piccolo esempio:
#! / bin / bash
per i in 0 1 2 3 4 # alla variabile $ i assegneremo alternativamente valori da 0 a 4 inclusi
fare
echo "Il numero della console è $ i" \u003e\u003e / dev / pts / $ i # Scrive la riga "Il numero della console è $ i" nel file / dev / pts / $ i (file terminale virtuale)
fatto # loop over
uscita 0
Dopo aver eseguito l'esempio, una riga con il suo numero apparirà nelle prime 5 console virtuali (terminali). I valori dall'elenco vengono sostituiti uno alla volta nella variabile $ i e il ciclo funziona con il valore di questa variabile
Cicli. Mentre loop.
Il ciclo while è più complesso del ciclo for-in e viene utilizzato per ripetere i comandi fino a quando alcune espressioni sono vere (codice di ritorno \u003d 0).La sintassi dell'operatore è la seguente:
mentre espressione o comando restituiscono un codice di ritorno
fare
squadre
fatto
Un esempio del funzionamento del ciclo è considerato nel seguente esempio:
#! / bin / bash
again \u003d yes # assegna nuovamente il valore "yes" alla variabile
while ["$ again" \u003d "yes"] # Eseguiremo un ciclo fino a quando $ again sarà uguale a "yes"
fare
echo "Inserisci un nome:"
leggi il nome
echo "Il nome che hai inserito è $ name"Eco "Desideri continuare?"
leggi ancora
fatto
echo "Ciao ciao"
E ora il risultato della sceneggiatura:
[e-mail protetta]: ~ $ ./bash2_primer1.sh
Per favore inserisci un nome:
ite
Il nome che hai inserito è ite
Vuoi continuare?
sì
Per favore inserisci un nome:
mihail
Il nome che hai inserito è mihail
Vuoi continuare?
no
Ciao ciao
Come puoi vedere, il loop viene eseguito fino a quando non introduciamo qualcosa di diverso da "yes". Tra do e done, puoi descrivere qualsiasi struttura, operatore, ecc., Tutti verranno eseguiti in un ciclo, ma dovresti fare attenzione con questo ciclo se esegui un comando al suo interno, senza cambiare la variabile di espressione, puoi entrare in un ciclo infinito.
Ora sulla condizione della verità. Dopo un po ', come nell'istruzione condizionale if-then-else, è possibile inserire qualsiasi espressione o comando che restituisca un codice di ritorno e il ciclo verrà eseguito fino a quando il codice di ritorno \u003d 0! L'operatore "[" è un analogo del comando test, che verifica la validità della condizione che gli è stata passata.
Considera un altro esempio, l'ho preso dal libro Advanced Bash Scripting. Mi è davvero piaciuto :), ma l'ho semplificato un po '. In questo esempio, introdurremo un altro tipo di loop UNTIL-DO.. Questo è quasi un analogo completo del ciclo WHILE-DO, solo alcune espressioni sono state eseguite finora.
Ecco un esempio:
#! / bin / bash
echo "Inserisci il numeratore:"
leggere il dividendo
echo "Inserisci il denominatore:"
leggi divisoreDnd \u003d $ dividendo # cambieremo le variabili dividendo e divisore,
# salva la loro conoscenza in altre variabili, come loro siamo noi
# bisogno
dvs \u003d $ divisore
resto \u003d 1Fino a ["$ remainder" -eq 0]
fare
lascia "resto \u003d dividendo% divisore"
dividendo \u003d $ divisore
divisore \u003d $ resto
fattoEco "GCD dei numeri $ dnd e $ dvs \u003d $ dividendo"
Il risultato dello script:
[e-mail protetta]: ~ $ ./bash2_primer3.sh
Inserisci il numeratore:
100
Inserisci il denominatore:
90
GCD dei numeri 100 e 90 \u003d 10
Operazioni matematiche
Lascia il comando.Il comando let esegue operazioni aritmetiche su numeri e variabili.
Considera un piccolo esempio in cui eseguiamo alcuni calcoli sui numeri inseriti:
#! / bin / bash
echo "Inserisci un:"
leggi un
echo "Inserisci b:"
leggi bLascia che "c \u003d a + b" # aggiunta
echo "a + b \u003d $ c"
let "c \u003d a / b" # division
echo "a / b \u003d $ c"
lascia "c<<= 2" #сдвигает c на 2 разряда влево
echo "c dopo uno spostamento di 2 cifre: $ c"
let "c \u003d a% b" # trova il resto della divisione di a per b
echo "$ a / $ b. saldo: $ c"
Risultato dell'esecuzione:
[e-mail protetta]: ~ $ ./bash2_primer2.sh
Entrare in un:
123
Inserisci b:
12
a + b \u003d 135
a / b \u003d 10
c dopo uno spostamento di 2 cifre: 40
123/12 Saldo: 3
Bene, come puoi vedere, niente di complicato, l'elenco delle operazioni matematiche è standard:
+ - aggiunta
- - sottrazione
* - moltiplicazione
/ - divisione
** - esponenziazione
% - module (modulo division), resto della divisione
ti permette di usare abbreviazioni di comandi aritmetici, riducendo così il numero di variabili utilizzate. Ad esempio: a \u003d a + b è equivalente a a \u003d \u003d b, ecc.
Lavorare con programmi esterni durante la scrittura di script di shell
Innanzitutto, una piccola teoria utile.Reindirizzamento dei flussi.
In bash (come molte altre shell) ci sono descrittori di file integrati: 0 (stdin), 1 (stdout), 2 (stderr).stdout - Output standard. Ottiene tutto ciò che viene visualizzato dal programma
stdin - Input standard. Questo è tutto ciò che l'utente digita nella console
stderr - Output errore standard.
Per le operazioni con questi descrittori, ci sono caratteri speciali:\u003e (reindirizzamento dell'output),< (перенаправление ввода). Оперировать ими не сложно. Например:
reindirizzare l'output di cat / dev / random su / dev / null (operazione assolutamente inutile :))) o
scrivere il contenuto della directory corrente nel file di elenco (già più utile)
Se è necessario aggiungere al file (quando si utilizza "\u003e" viene sostituito), è necessario utilizzare "\u003e\u003e" anziché "\u003e"
dopo la richiesta di sudo per una password, verrà presa dal file my_password, come se fosse stato inserito dalla tastiera.
Se è necessario scrivere nel file solo errori che potrebbero essersi verificati durante il funzionamento del programma, è possibile utilizzare:
./program_with_error 2\u003e file_erroreil numero 2 prima di "\u003e" significa che devi reindirizzare tutto ciò che cade nella maniglia 2 (stderr).
Se devi forzare stderr a scrivere su stdout, puoi rintracciarlo. modo:
carattere "&" significa puntatore per gestire 1 (stdout)
(Per impostazione predefinita, stderr scrive sulla console su cui l'utente sta lavorando (scrive sul display in precedenza)).
2. Trasportatori.
La pipeline è uno strumento molto potente per lavorare con la console Bash. La sintassi è semplice:team1 | comando 2 - significa che l'output del comando 1 verrà trasmesso all'ingresso del comando 2
Le pipeline possono essere raggruppate in catene e output utilizzando il reindirizzamento a un file, ad esempio:
ls -la | grep "hash" | sort\u003e sortilg_listl'output del comando ls -la viene passato al comando grep, che seleziona tutte le righe contenenti la parola hash e passa il comando sort al comando sort, che scrive il risultato nel file sorting_list. Tutto è abbastanza chiaro e semplice.
Molto spesso, gli script Bash vengono utilizzati per automatizzare alcune operazioni di routine nella console, quindi a volte diventa necessario elaborare lo stdout di un comando e trasferirlo su stdin su un altro comando, mentre il risultato dell'esecuzione di un comando deve essere gestito in qualche modo. In questa sezione, cercherò di spiegare i principi di base del lavoro con comandi esterni all'interno dello script. Penso di aver dato abbastanza esempi e ora possiamo scrivere solo i punti principali.
1. Passare l'output a una variabile.
Per scrivere l'output di un comando in una variabile, è sufficiente racchiudere il comando tra virgolette, ad esempioa \u003d `echo" qwerty "`
echo $ aRisultato del lavoro: qwerty
Tuttavia, se si desidera scrivere un elenco di directory in una variabile, è necessario elaborare correttamente il risultato per inserire i dati nella variabile. Considera un piccolo esempio:
ELENCO \u003d `find / svn / -type d 2\u003e / dev / null | awk "(FS \u003d" / ") (stampa $ 4)" | ordina | uniq | tr "\\ n" "" `
per ONE_OF_LIST in $ LIST
fare
svnadmin hotcopy / svn / $ ONE_OF_LIST / svn / temp4backup / $ ONE_OF_LIST
fatto
Qui usiamo il ciclo for-do-done per archiviare tutte le directory nella cartella / svn / usando il comando svnadmin hotcopy (che nel nostro caso non ha importanza per nessuno, solo come esempio). Di grande interesse è la linea: LIST \u003d `find / svn / -type d 2\u003e / dev / null | awk "(FS \u003d" / ") (stampa $ 4)" | ordina | uniq | tr "\\ n" "" `In esso, alla variabile LIST è assegnata l'esecuzione del comando find elaborato dai comandi awk, sort, uniq, tr (non prenderemo in considerazione tutti questi comandi, poiché si tratta di un articolo separato). La variabile LIST conterrà i nomi di tutte le directory nella cartella / svn / situata sulla stessa riga (per cancellarla dal ciclo.
Come puoi vedere, tutto non è complicato, basta capire il principio e scrivere un paio di script. In conclusione, ti auguro buona fortuna nell'apprendimento di BASH e Linux in generale. Le critiche come al solito sono benvenute. Il prossimo articolo sarà probabilmente dedicato all'uso di programmi come sed, awk.
Degtyarev E.K. Shell: un interprete di comandi emessi dal terminale o da un file batch. esso programma regolare (ovvero non incluso nel core sistema operativo UNIX). Può essere sostituito da un altro o avere diversi. Le due versioni più famose sono: - Shell (versione UNIX 7) o Bourne Shell (dal nome dell'autore S.R. Bourne di Bell Labs); - C-Shell (versioni Berkley UNIX). Sono simili, ma ci sono alcune differenze: C-Shell è più potente in modalità dialogo, mentre Shell normale ha strutture di controllo più eleganti. Shell è un linguaggio di programmazione in quanto ha: - variabili; - strutture di controllo (come se); - subroutine (inclusi file batch); - trasferimento di parametri; - interrompere la gestione.