Script di Bash che analizza l'argomento tra virgolette


8

Si prega di considerare questo semplice script chiamato test :

#!/bin/bash
echo $1

e i seguenti comandi e chiamate:

$ echo "A B"
A B
$ echo ""A B""
A B
$ echo """A B"""
A B
$ echo """A B"""
A B

$ ./test "A B"
A B
$ ./test ""A B""
A
$ ./test """A B"""
A B
$ ./test """"A B""""
A

Qualcuno potrebbe spiegare perché la chiamata del test non si comporta come l' eco del comando o punta alla documentazione pertinente?


2
Esiste già un comando di test , sei fortunato ad aver utilizzato l'intero percorso, altrimenti avresti avuto difficoltà a eseguire il debug della situazione.
Rui F Ribeiro,

3
Meglio per questo tipo di test è usare printf '%q\n' "$@"invece che echoaffatto, il che emetterà i tuoi argomenti uno-a-una-linea con caratteri nascosti e spazi bianchi fuggiti in una forma visibile.
Charles Duffy,

Risposte:


13

Perché echoconcatena tutti gli argomenti per stamparli e il tuo script è limitato al primo argomento. Dovresti usare "$@"e non $1nella tua sceneggiatura.

Diamo un'occhiata agli argomenti che stai fornendo per i tuoi test:

  • ./test "A B"
    • un argomento, la stringa di 3 caratteri AspaceB
  • ./test ""A B""
    • due argomenti
      • in primo luogo, empty stringconcatenato conA
      • secondo, Bconcatenato conempty string
  • ./test """A B"""
    • un argomento, empty stringconcatenato con AspaceBconcatenato conempty string
  • ./test """"A B""""
    • due argomenti
      • in primo luogo, empty stringconcatenato con empty stringconcatenato conA
      • secondo, Bconcatenato con empty stringconcatenato conempty string

Nota: vedresti risultati diversi da echose avessi usato più di uno spazio nei tuoi argomenti. Questo perché l'eco concatena i suoi argomenti con un unico spazio:

$ echo "A   B"
A   B
$ echo ""A   B""
A B
$ echo """A   B"""
A   B
$ echo """"A   B""""
A B

quelli sono piccoli e graziosi scarabocchi vuoti .
Mikeserv,

2
esattamente, le citazioni non nidificano ...
mr.spuratic l'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.