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


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow