Valutazione di una stringa nello script di shell


8

Sto seguendo questa guida allo scripting della shell bash:

Nella sezione Confronti numerici, cita un esempio:

anny > num=`wc -l work.txt`

anny > echo $num
201

anny > if [ "$num" -gt "150" ]
More input> then echo ; echo "you've worked hard enough for today."
More input> echo ; fi

Ciò che sembra accadere sopra è che memorizziamo una stringa di comandi in una variabile bash e quindi invochiamo l'eco sulla variabile. Quello che sembra accadere è che la stringa venga valutata e il comando wc venga eseguito e restituisca il conteggio delle righe al terminale di controllo.

Ok, quindi lancio il mio terminale in Ubuntu 12.04 e provo qualcosa di simile:

$ touch sample.txt && echo "Hello World" > sample.txt
$ cat sample.txt
Hello World
$ num='wc -l sample.txt'
echo $num
wc -l sample.txt

Aspetta un secondo, che non ha valutato la stringa e restituisce il conteggio delle righe. Ciò ha appena fatto eco alla stringa al terminale. Perché ho ottenuto risultati diversi?


Nota che a num non è mai stata assegnata la stringa wc -l work.txt, invece è assegnato il numero 201.
ignis

Risposte:


2

È necessario utilizzare i backtick per valutare l'espressione.

$ num=`wc -l sample.txt`
$ echo $num
1 sample.txt

Se vuoi vedere solo "1" nell'output, usa il comando

$ num=`cat sample.txt | wc -l`
$ echo $num
1

E funziona anche:

$ num=`wc -l < sample.txt`
$ echo $num
1

Per ulteriori informazioni, vedere Differenze tra virgolette "", virgolette singole '' e backtick ´ ´ sulla riga di comando?


Hai idea del perché ottengo '1 sample.txt' e non solo il numero '1'?
John Merlino,

Ecco come wcfunziona il comando. Prova cat sample.txt | wc -l.
Danatela,

wc -l visualizza il numero di righe presenti in un file insieme al suo nome file.
Avinash Raj,

5

Si prega di notare quel simbolo:

'

Virgoletta singola

   Enclosing characters in single quotes preserves the  literal  value  of
   each character within the quotes.  A single quote may not occur between
   single quotes, even when preceded by a backslash.

e

`

backquote

   Command substitution allows the output of a command to replace the com
   mand name.  There are two forms:

          $(command)
   or
          `command`

   Bash performs the expansion by executing command and replacing the com
   mand  substitution  with  the  standard output of the command, with any
   trailing newlines deleted.

Quindi il Backquote sta restituendo il risultato del comando all'output standard. È per questo

`wc -l sample.txt`

restituisce i risultati del comando, mentre

'wc -l sample.txt'

restituisce semplicemente "wc -l sample.txt" come al solito stringa

Considera di fare questo come esempio:

$ A='wc -l /proc/mounts'
$ B=`wc -l /proc/mounts`
$ C=$(wc -l /proc/mounts)

E ora fai eco a tutte e tre le variabili:

$ echo $A
wc -l /proc/mounts
$ echo $B
35 /proc/mounts
$ echo $C
35 /proc/mounts

4

Se si desidera acquisire l'output di un comando in una variabile, è necessario utilizzare i backtick ``o racchiudere il comando in $():

$ d=$(date)
$ echo "$d"
Mon Mar 17 10:22:25 CET 2014
$ d=`date`
$ echo "$d"
Mon Mar 17 10:22:25 CET 2014

Si noti che la stringa viene effettivamente valutata al momento della dichiarazione della variabile, non quando la si fa eco. Il comando viene effettivamente eseguito all'interno dei $()backtick o e l'output di quel comando viene salvato come valore della variabile.

In generale, dovresti sempre usare al $()posto dei backtick che sono deprecati e solo in giro per motivi di compatibilità e molto più limitati. Ad esempio, non è possibile annidare i comandi all'interno di backtick ma è possibile con $():

$ echo $(date -d $(echo yesterday))
Sun Mar 16 10:26:07 CET 2014

Vedi questa discussione su U&L per ulteriori dettagli sul perché ``dovrebbe essere evitato.


1
Sono d'accordo script dovrebbero preferire $( )a ` `. Ma, come wag dice , apici fanno nido. echo $(date -d $(echo yesterday))diventa echo `date -d \`echo yesterday\``; echo $(echo $(date -d $(echo yesterday)))diventa echo `echo \`date -d \\\`echo yesterday\\\`\``. Dico questo non confutare la tua tesi, ma per rafforzarla : i backquotes interni sfuggiti rendono la ` `sintassi più potente di quanto spesso ammesso, ma un trattamento speciale \è strano, sorprendente e difficile da ragionare. Con $( )quello che vedi è di solito quello che ottieni.
Eliah Kagan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.