2016-05-10 19 views
6

C'è qualche differenza tra [email protected] e "[email protected]"?

Capisco che potrebbero esserci differenze per caratteri non speciali, ma per quanto riguarda il segno @ con argomenti di input?

+1

La domanda non è un duplicato rigoroso, ma le risposte anche qui rispondono a questa domanda. –

risposta

9

Sì!

$ cat a.sh 
echo "[email protected]" 
echo [email protected] 

Corriamo esso:

$ ./a.sh 2 "3  4" 5 
2 3  4 5     # output for "[email protected]" 
2 3 4 5      # output for [email protected] -> spaces are lost! 

Come si può vedere, utilizzando [email protected] rende i parametri per "perdere" alcuni contenuti quando viene utilizzato come parametro. Vedere -per esempio- I just assigned a variable, but echo $variable shows something else per una spiegazione dettagliata di questo.


Da GNU Bash manual --> 3.4.2 Special Parameters:

@

($ @) espande nei parametri posizionali, a partire da uno. Quando l'espansione avviene tra virgolette doppie, ciascun parametro si espande in una parola separata. Cioè, "$ @" equivale a "$ 1" "$ 2" .... Se l'espansione a virgolette si verifica all'interno di una parola, l'espansione del primo parametro viene unita alla parte iniziale della parola originale e l'espansione dell'ultimo parametro viene unita all'ultima parte della parola originale. Quando non ci sono parametri posizionali, "$ @" e $ @ non si espandono su nulla (ad esempio, vengono rimossi).

5

Passare $ @ a un comando passa tutti gli argomenti al comando. Se un argomento contiene uno spazio, il comando vedrebbe quell'argomento come due separati.

Passare "$ @" a un comando passa tutti gli argomenti come stringhe citate al comando. Il comando vedrà un argomento contenente spazi bianchi come un singolo argomento contenente spazi bianchi.

di visualizzare facilmente la differenza scrivere una funzione che stampa tutti i suoi argomenti in un ciclo, uno alla volta:

#!/bin/bash 

loop_print() { 
    while [[ $# -gt 0 ]]; do 
     echo "argument: '$1'" 
     shift 
    done 
} 

echo "#### testing with \[email protected] ####" 
loop_print [email protected] 
echo "#### testing with \"\[email protected]\" ####" 
loop_print "[email protected]" 

Chiamando lo script con

<script> "foo bar" 

produrrà l'uscita

#### testing with [email protected] #### 
argument: 'foo' 
argument: 'bar' 
#### testing with "[email protected]" #### 
argument: 'foo bar' 
Problemi correlati