Ricerca…
Sintassi
- \ C (qualsiasi carattere tranne newline)
- 'tutto letterale tranne le virgolette singole'; 'this:' \ '' è una citazione singola '
- $ 'only \\ and \' sono speciali; \ n = newline ecc. '
- "$ variabile e altro testo; \" \\\ $ \ `sono speciali"
Newline e caratteri di controllo
Una nuova riga può essere inclusa in una stringa a stringa singola o doppia. Si noti che il backslash-newline non ha come risultato una nuova riga, l'interruzione di riga viene ignorata.
newline1='
'
newline2="
"
newline3=$'\n'
empty=\
echo "Line${newline1}break"
echo "Line${newline2}break"
echo "Line${newline3}break"
echo "No line break${empty} here"
All'interno di stringhe di virgolette, backslash-letter o backslash-octal possono essere utilizzati per inserire caratteri di controllo, come in molti altri linguaggi di programmazione.
echo $'Tab: [\t]'
echo $'Tab again: [\009]'
echo $'Form feed: [\f]'
echo $'Line\nbreak'
Virgolette doppie per sostituzione di variabili e comandi
Sostituzioni variabili dovrebbero essere utilizzate solo tra virgolette.
calculation='2 * 3'
echo "$calculation" # prints 2 * 3
echo $calculation # prints 2, the list of files in the current directory, and 3
echo "$(($calculation))" # prints 6
Al di fuori delle virgolette doppie, $var
prende il valore di var
, lo divide in parti delimitate da spazi bianchi e interpreta ogni parte come un modello glob (carattere jolly). A meno che tu non voglia questo comportamento, metti sempre $var
tra virgolette doppie: "$var"
.
Lo stesso vale per le sostituzioni di comando: "$(mycommand)"
è l'output di mycommand
, $(mycommand)
è il risultato di split + glob sull'output.
echo "$var" # good
echo "$(mycommand)" # good
another=$var # also works, assignment is implicitly double-quoted
make -D THING=$var # BAD! This is not a bash assignment.
make -D THING="$var" # good
make -D "THING=$var" # also good
Le sostituzioni di comando ottengono i propri contesti di quotatura. Scrivere sostituzioni arbitrariamente nidificate è facile perché il parser terrà traccia della profondità di annidamento invece di cercare avidamente il primo "
carattere "
, tuttavia l'evidenziatore della sintassi di StackOverflow analizza questo errore, ad esempio:
echo "formatted text: $(printf "a + b = %04d" "${c}")" # “formatted text: a + b = 0000”
Gli argomenti variabili di una sostituzione di comando devono essere citati due volte all'interno delle espansioni:
echo "$(mycommand "$arg1" "$arg2")"
Citare il testo letterale
Tutti gli esempi in questo paragrafo stampano la linea
!"#$&'()*;<=>? @[\]^`{|}~
Una barra rovesciata cita il carattere successivo, ovvero il successivo carattere viene interpretato letteralmente. L'unica eccezione è una nuova riga: backslash-newline si espande nella stringa vuota.
echo \!\"\#\$\&\'\(\)\*\;\<\=\>\?\ \ \@\[\\\]\^\`\{\|\}\~
Tutto il testo tra virgolette singole (virgolette in avanti '
, anche note come apostrofo) viene stampato letteralmente. Anche il backslash è sinonimo di se stesso ed è impossibile includere una singola citazione; al contrario, è possibile interrompere la stringa letterale, includere una virgoletta singola letterale con una barra rovesciata e avviare nuovamente la stringa letterale. Quindi la sequenza di 4 caratteri '\''
consente effettivamente di includere una singola citazione in una stringa letterale.
echo '!"#$&'\''()*;<=>? @[\]^`{|}~'
# ^^^^
Dollar-single-quote inizia una stringa letterale $'…'
come molti altri linguaggi di programmazione, dove il backslash riporta il carattere successivo.
echo $'!"#$&\'()*;<=>? @[\\]^`{|}~'
# ^^ ^^
Le doppie virgolette "
delimitano le stringhe semi-letterali in cui solo i caratteri "
\
$
e `
mantengono il loro significato speciale. Questi personaggi hanno bisogno di un backslash prima di loro (si noti che se il backslash è seguito da qualche altro carattere, il backslash rimane). Le doppie virgolette sono utili soprattutto quando si include una variabile o una sostituzione di comando.
echo "!\"#\$&'()*;<=>? @[\\]^\`{|}~"
# ^^ ^^ ^^
echo "!\"#\$&'()*;<=>? @[\]^\`{|}~"
# ^^ ^ ^^ \[ prints \[
Interagire, attenzione !
attiva l'espansione della cronologia tra virgolette doppie: "!oops"
cerca un comando più vecchio che contiene oops
; "\!oops"
non esegue l'espansione della cronologia ma mantiene il backslash. Questo non succede negli script.
Differenza tra virgolette doppie e virgolette singole
Doppia citazione | Citazione singola |
---|---|
Consente l'espansione variabile | Previene l'espansione delle variabili |
Consente l'espansione della cronologia se abilitata | Previene l'espansione della cronologia |
Permette la sostituzione del comando | Impedisce la sostituzione del comando |
* e @ possono avere un significato speciale | * e @ sono sempre letterali |
Può contenere sia una singola citazione che una doppia citazione | La citazione singola non è consentita all'interno di virgolette singole |
$ , ` , " , \ può essere sfuggito con \ per impedire il loro significato speciale | Tutti loro sono letterali |
Proprietà comuni a entrambi:
- Previene il globbing
- Previene la divisione delle parole
Esempi:
$ echo "!cat"
echo "cat file"
cat file
$ echo '!cat'
!cat
echo "\"'\""
"'"
$ a='var'
$ echo '$a'
$a
$ echo "$a"
var