Sembra che il tuo comando stia forse impostando le variabili di ambiente in base agli argomenti forniti nella riga di comando. Può darsi che tu possa fare:
CLUSTER=cl1; cluster=$CLUSTER command
... e imposta il suo ambiente per esso su invito.
Altrimenti, le citazioni di shell in genere delimitano gli argomenti o sfuggono ad altri caratteri di shell speciali dall'interpretazione della shell. Puoi contenere (e quindi sfuggire) diversi tipi di citazioni di shell all'interno di altri tipi in base a varie regole:
"''''"
- una stringa tra virgolette può contenere qualsiasi numero di virgolette.
"\""
- una \
barra rovesciata può sfuggire a una "
virgoletta all'interno di una "
stringa tra virgolette.
- In questo contesto, una
\\
barra rovesciata sfugge anche a se stessa, al \$
token di espansione e alle \n
ewline come indicato di seguito, ma viene altrimenti trattata letteralmente.
"${expand} and then some"
- una stringa tra virgolette può contenere $
un'espansione della shell interpretata .
'"\'
- una '
stringa tra virgolette può contenere qualsiasi carattere diverso da una '
virgoletta.
\
- una barra rovesciata non quotata sfuggirà a qualsiasi personaggio successivo per interpretazione letterale - anche un'altra barra rovesciata - tranne una \n
ewline.
- In un
\\n
caso di ewline sia la \
barra rovesciata che la \n
ewline vengono completamente rimosse dal comando interpretato risultante.
${parameter+expand "$parameter"}
- le virgolette risultanti da un'espansione della shell non servono quasi mai come delimitatori, tranne alcuni casi speciali. Non mi azzarderò a descriverli qui di seguito.
Ritengo strano che qualsiasi applicazione interpreti le virgolette nei suoi argomenti della riga di comando. Tale pratica non ha molto senso in questo - almeno per le shell - lo scopo principale di una citazione è generalmente di delimitare un argomento. All'invocazione, tuttavia, gli argomenti sono sempre già delimitati da \0NUL
caratteri e quindi una citazione non può servire a molto scopo.
Anche una shell in genere si preoccupa di interpretare le virgolette in uno dei suoi argomenti di invocazione quando viene chiamata con un -c
interruttore - il che indica che il suo primo operando è in realtà uno script di shell che dovrebbe essere eseguito su chiamata. Questo è un caso di input valutato due volte .
Detto questo, puoi fare una serie di cose per passare citazioni letterali tramite argomenti sulla riga di comando. Per esempio:
CLUSTER='"cl1"'; command -p "cluster=$CLUSTER"
Come ho notato in un commento prima, puoi contenere le "
virgolette all'interno di un'espansione che è a sua volta "
citata.
CLUSTER=cl1; command -p "cluster=\"$CLUSTER\""
È possibile uscire "
da una \
barra rovesciata all'interno della "
stringa tra virgolette.
CLUSTER=cl1; command -p cluster='"'"$CLUSTER"'"'
Puoi alternare e concatenare gli stili di quotazione per arrivare al risultato finale desiderato, come indicato sopra nelle note di @jimmij .
CLUSTER=cl1; ( set -f; IFS=; command -p cluster=\"$CLUSTER\" )
È possibile disattivare sia la generazione nome di file e $IFS
la scissione - evitando così la necessità di citare il $expansion
a tutti - e così citare solo le virgolette. Questo è probabilmente eccessivo.
Infine, esiste un altro tipo di shell-quote che potrebbe essere utilizzato. Come ho notato prima, la sh -c "$scriptlet"
forma di invocazione della shell viene spesso utilizzata per fornire lo script di una shell sulla riga di comando. $scriptlet
Tuttavia, quando diventa complicato - come quando le virgolette devono contenere altre virgolette - può spesso essere vantaggioso usare un documento qui e sh -s
invece - in cui la shell è specificatamente incaricata di assegnare tutti i seguenti operandi ai parametri posizionali come farebbe in un -c
caso e tuttavia prendere anche la sua sceneggiatura stdin
.
Se il tuo comando deve interpretare le virgolette in questo modo, lo considererei meglio se potesse farlo in un input di file. Per esempio:
CLUSTER=cl1
command --stdin <<-SCRIPT
cluster="$CLUSTER"
SCRIPT
Se non si cita il delimitatore di a, <<here-document
tutti i suoi contenuti vengono trattati quasi esattamente come se fossero "
citati in chiaro - tranne per il fatto che le "
doppie virgolette non vengono trattate in modo speciale. E quindi se invece eseguiamo quanto sopra con cat
:
CLUSTER=cl1
cat <<-SCRIPT
cluster="$CLUSTER"
SCRIPT
... stampa ...
cluster="cl1"
CLUSTER='"cl1"'; command -p "cluster=$CLUSTER"