Al repo
comando non può importare il tipo di virgolette che riceve. Se hai bisogno di espansione dei parametri, usa virgolette doppie. Se ciò significa che devi finire con il backslash di molte cose, utilizzare virgolette singole per la maggior parte di esse, quindi uscire da loro e andare in doppio per la parte in cui è necessaria l'espansione.
repo forall -c 'literal stuff goes here; '"stuff with $parameters here"' more literal stuff'
La spiegazione segue, se sei interessato.
Quando si esegue un comando dalla shell, ciò che quel comando riceve come argomenti è una matrice di stringhe con terminazione null. Tali stringhe possono contenere assolutamente qualsiasi carattere non nullo.
Ma quando la shell sta costruendo quella matrice di stringhe da una riga di comando, interpreta alcuni caratteri appositamente; questo è progettato per rendere i comandi più facili (anzi, possibili) da digitare. Ad esempio, gli spazi indicano normalmente il limite tra le stringhe nell'array; per questo motivo, i singoli argomenti sono talvolta chiamati "parole". Ma un argomento può tuttavia contenere degli spazi; hai solo bisogno di un modo per dire alla shell che è quello che vuoi.
Puoi usare una barra rovesciata di fronte a qualsiasi personaggio (incluso lo spazio o un'altra barra rovesciata) per dire alla shell di trattare quel personaggio alla lettera. Ma mentre puoi fare qualcosa del genere:
echo \"Thank\ you.\ \ That\'ll\ be\ \$4.96,\ please,\"\ said\ the\ cashier
... può diventare noioso. Quindi la shell offre un'alternativa: virgolette. Questi sono disponibili in due varietà principali.
Le virgolette doppie sono chiamate "virgolette di raggruppamento". Impediscono l'espansione di caratteri jolly e alias, ma principalmente servono per includere spazi in una parola. Altre cose come l'espansione dei parametri e dei comandi (il genere di cose segnalato da a $
) si verificano ancora. E ovviamente se vuoi una doppia virgoletta letterale all'interno di virgolette doppie, devi sostituirla:
echo "\"Thank you. That'll be \$4.96, please,\" said the cashier"
Le virgolette singole sono più draconiane. Tutto tra loro viene preso alla lettera, comprese le barre rovesciate. Non c'è assolutamente modo di ottenere una virgoletta singola letterale all'interno di virgolette singole.
Fortunatamente, le virgolette nella shell non sono delimitatori di parole ; da soli, non terminano una parola. Puoi entrare e uscire dalle virgolette, anche tra diversi tipi di virgolette, all'interno della stessa parola per ottenere il risultato desiderato:
echo '"Thank you. That'\''ll be $4.96, please," said the cashier'
Quindi è più facile: molte meno barre rovesciate, anche se la sequenza di virgolette singole, virgolette-letterali, virgolette singole, richiede un po 'di tempo per abituarsi.
Le shell moderne hanno aggiunto un altro stile di quotazione non specificato dallo standard POSIX, in cui il segno di virgolette singolo iniziale è preceduto da un segno di dollaro. Le stringhe in modo citati seguono le convenzioni simili a stringhe letterali nel linguaggio di programmazione ANSI C, e quindi sono a volte chiamati "stringhe ANSI" e la $'
... '
coppia di "citazioni" ANSI. All'interno di tali stringhe, i consigli di cui sopra sui contraccolpi che vengono presi alla lettera non si applicano più. Invece, diventano di nuovo speciali - non solo puoi includere una virgoletta singola letterale o una barra rovesciata anteponendole a una barra rovesciata, ma la shell espande anche le escape del carattere ANSI C (come \n
per una nuova riga, \t
per la scheda e \xHH
per il carattere con codice esadecimaleHH
). Altrimenti, tuttavia, si comportano come stringhe tra virgolette singole: non viene effettuata la sostituzione di alcun parametro o comando:
echo $'"Thank you. That\'ll be $4.96, please," said the cashier'
La cosa importante da notare è che la singola stringa ricevuta come argomento per il echo
comando è esattamente la stessa in tutti questi esempi. Dopo che la shell ha terminato l'analisi di una riga di comando, non è possibile eseguire il comando per dire cosa è stato citato. Anche se lo volesse.
repo forall -c ' ...before... '"$variable"' ...after...'