Come continuare una frase con un comando all'interno


12

Ad esempio, ho cercato di dire "Al momento ci sono 10 persone online" nel mio file di script.

Non riesco mai a far funzionare il comando senza la parte "persone online al momento" nella riga successiva.

Al momento, ho

w='who | wc -l' 
echo "There are $w people online at the moment" 

Tuttavia, finisco sempre con l'output

There are who | wc -l users online at the moment 

Come si fa a far funzionare il comando nel mezzo? Ho cercato di cercare e copiare esempi, ma non sembra aiutare il mio problema di sostituzione dei comandi.

Risposte:


20

Vuoi l'output di

who | wc -l

assegnato a w, non quella stringa, che è ciò che ottieni a causa delle virgolette che lo circondano. Dovresti usare la sostituzione dei comandi $(...):

w=$(who | wc -l)
echo "There are $w people online at the moment"

(puoi anche usare i backquotes, ma non puoi nidificarli facilmente).


In alcune shell, incluso Bash, puoi annidare i backquotes. Richiede fughe nidificati, vedi esempio a stackoverflow.com/a/2657037/776723
ShadSterling

1
@Polyergic Thanks. Ho aggiornato la mia risposta, ma penso che continuerò a nidificare $()me stesso ;-)
Anthon,

10

Un'altra soluzione:

echo There are $(who | wc -l) people online at the moment


5

dovresti usare backtick per eseguire il comando

w=`who | wc -l` echo "There are $w people online at the moment"



7
Punto valido. "Il backtick è anche facilmente confuso con una singola citazione." esattamente quello che è successo qui.
Ghanima,

@Ghanima: Davvero! Questa domanda è un ottimo esempio di quando dobbiamo dimostrare perché i backtick dovrebbero essere evitati. :)
PM 2Ring

Bene, ho votato solo questa risposta perché è l'unica che ha spiegato esattamente dove l'OP ha avuto l'errore. Se i bastoncini sono buoni o cattivi sono solo note a margine.
Ruslan,
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.