GNU/Linux >> Linux Esercitazione >  >> Linux

Scripting Bash:passaggio dall'operatore backtick a $ parentesi

Ci sono alcuni comandi o trucchi che inizi a usare come amministratore di sistema, che incorpori semplicemente nel tuo arsenale e non smetti mai di analizzare in profondità tutte le opzioni o alternative ad essi.

Per me, uno di quei trucchi è l'operatore backtick. L'ho usato piuttosto frequentemente quando ho programmato in Perl (che non uso al giorno d'oggi, ma sembra avere ancora un fedele fan club - controlla questo sondaggio). Nei miei script Perl, userei l'operatore backtick per eseguire un comando nel sistema operativo e restituire l'output per continuare la logica nello script.

[ Potrebbe piacerti anche: Scripting Bash:come scrivere dati su file di testo ]

L'operatore backtick è disponibile anche negli script della shell e, poiché è così facile da combinare con altri comandi, ho iniziato a usarlo molto. Tuttavia, c'è un modo più "consigliato" per fare la stessa cosa, usando il $ operatore parentesi (parentesi).

In questo articolo, ti mostro i pro ei contro di ciascuno per l'uso negli script di shell.

La funzionalità di base dei backtick

L'Open Group ha una definizione per l'operatore backtick, ufficialmente denominato sostituzione del comando. Questo operatore non il carattere di virgolette singole, ma un altro carattere noto come accento grave (` ).

L'idea è semplice:

❯ echo "There are `ls | wc -l` files in this directory"
There are 3 files in this directory

Ho un gruppo di comandi molto semplice, ls | wc -l che utilizzo per elencare e contare il numero di file nella directory corrente. Posso farlo facilmente in modo interattivo e vedere esattamente qual è il risultato. Quindi posso incorporarlo nel mio echo principale comando.

In uno script di shell, potrei sicuramente eseguire la stessa cosa, assegnando il risultato del mio comando count a una variabile e quindi utilizzare la variabile in un secondo momento.

❯ file_count=`ls | wc -l`
❯ echo "There are $file_count files in this directory"
There are 3 files in this directory

E, naturalmente, sarebbe meglio se l'idea fosse quella di riutilizzare il valore o se l'operazione da eseguire non è stata così semplice come nel mio esempio.

Incorporare i comandi usando i backtick è ciò che classificherei come "trucchi rapidi e sporchi".

I $ genitori

Puoi ottenere lo stesso risultato sostituendo i backtick con $ parents, come nell'esempio seguente:

❯ echo "There are $(ls | wc -l) files in this directory"
There are 3 files in this directory

Ecco un altro esempio, ancora molto semplice ma un po' più realistico. Devo risolvere qualcosa nelle mie connessioni di rete, quindi decido di mostrare minuto per minuto le mie connessioni totali e in attesa.

❯ cat netinfo.sh
#!/bin/bash
while true
do
  ss -an > netinfo.txt
  connections_total=$(cat netinfo.txt | wc -l)
  connections_waiting=$(grep WAIT netinfo.txt | wc -l)
  printf "$(date +%R) - Total=%6d Waiting=%6d\n" $connections_total $connections_waiting
  sleep 60
done

❯ ./netinfo.sh
22:59 - Total=  2930 Waiting=   977
23:00 - Total=  2923 Waiting=   963
23:01 - Total=  2346 Waiting=   397
23:02 - Total=  2497 Waiting=   541

Non sembra un enorme differenza, giusto? Ho dovuto solo regolare la sintassi. Bene, ci sono alcune implicazioni che coinvolgono i due approcci. Se sei come me, che usa automaticamente i backtick senza nemmeno battere ciglio, continua a leggere.

Deprecazione e consigli

Deprecazione suona come una brutta parola e, in molti casi, potrebbe essere davvero brutta.

Durante la ricerca delle spiegazioni per l'operatore backtick, ho trovato alcune discussioni su "gli operatori backtick sono deprecati?"

La risposta breve è:non nel senso di "sul punto di non essere supportato e smettere di lavorare". Tuttavia, i backtick dovrebbero essere evitati e sostituiti da $ sintassi di parentesi.

Le ragioni principali di ciò sono (in nessun ordine particolare):

1. Gli operatori dei backtick possono diventare disordinati se anche i comandi interni utilizzano i backtick.

  • Dovrai evitare i backtick interni e, se hai virgolette singole come parte dei comandi o dei risultati, la lettura e la risoluzione dei problemi dello script può diventare difficile.
  • Se inizi a pensare alla nidificazione operatori di backtick all'interno di altri operatori di backtick, le cose non funzioneranno come previsto o non funzioneranno affatto. Non preoccuparti.

2. Il $ parens è più sicuro e più prevedibile.

  • Cosa codifichi all'interno di $ l'operatore parens viene trattato come uno script di shell. Sintatticamente è la stessa cosa di avere quel codice in un file di testo, quindi puoi aspettarti che tutto ciò che codificheresti in uno script di shell isolato funzionerebbe qui.

Ecco alcuni esempi delle differenze comportamentali tra backtick e $ genitori:

❯ echo '\$x'
\$x

❯ echo `echo '\$x'`
$x

❯ echo $(echo '\$x')
\$x

Puoi trovare ulteriori esempi delle differenze tra backtick e $ comportamento dei genitori qui.

[ Cheat sheet gratuito:ottieni un elenco di utilità e comandi Linux per la gestione di server e reti. ] 

Conclusione

Se confronti i due approcci, sembra logico pensare che dovresti usare sempre/solo il $ approccio dei genitori. E potresti pensare che gli operatori di backtick siano utilizzati solo dagli amministratori di sistema di un'era precedente.

Ebbene, potrebbe essere vero, poiché a volte uso cose che ho imparato molto tempo fa e, in situazioni semplici, la mia "memoria muscolare" lo codifica per me. Per quei comandi ad hoc che conosci e che non contengono caratteri sgradevoli, potresti essere d'accordo con i backtick. Ma per tutto ciò che è più perenne o più complesso/sofisticato, vai con il $ approccio dei genitori.


Linux
  1. Script Bash(I)

  2. Impedire l'esecuzione simultanea di uno script bash

  3. Rigenerare .bashrc dalla shell corrente?

  4. [ :Operatore imprevisto nella programmazione della shell

  5. a partire da apachectl bash

Bash Scripting – Case Statement

Scripting Bash:come leggere i dati dai file di testo

Allontanarsi da Windows - Inizia

Script Bash(II)

Scripting Bash(III)

C'è un modo per mostrare la notifica dallo script bash in Ubuntu?