Potresti usare cat
con il -A
opzione:dal manuale:
-A, --show-all
equivalent to -vET
-E, --show-ends
display $ at end of each line
-T, --show-tabs
display TAB characters as ^I
-v, --show-nonprinting
use ^ and M- notation, except for LFD and TAB
Quindi cat -A yourscrip.sh
ti mostrerà personaggi invisibili e strani.
Un'opzione è guardare i caratteri che stai cercando di utilizzare con un visualizzatore o un editor esadecimale. hexdump
è una buona opzione se sei limitato al terminale.
$ hexdump -Cv <<"EOF"
> [ -f /etc/openvpn/client.conf ] && echo true
> EOF
00000000 5b 20 2d 66 20 2f 65 74 63 2f 6f 70 65 6e 76 70 |[ -f /etc/openvp|
00000010 6e 2f 63 6c 69 65 6e 74 2e 63 6f 6e 66 20 5d 20 |n/client.conf ] |
00000020 26 26 20 65 63 68 6f 20 74 72 75 65 0a |&& echo true.|
0000002d
Puoi vedere qui che il space
, close-square-brace
, space
sono corretti - 0x20
, 0x5D
, 0x20
.
Questi valori sono codici ASCII, visualizzati in esadecimale. Qualsiasi valore al di fuori dell'intervallo 0x20
- 0x7E
non è un "carattere stampabile " per quanto riguarda ASCII, e molto probabilmente non funzionerà bene con le interfacce a riga di comando.
Nota: Ho copiato il tuo primo "rotto " riga da utilizzare nel hexdump
esempio sopra, quindi qualcosa ha sostituito non-uno-spazio-ASCII con uno spazio ASCII tra la tua fonte originale e la tua domanda resa.
Per ripetere l'operazione, procedi come segue:
- Digita
hexdump -Cv <<"EOF"
e premi Invio - Incolla il testo che desideri utilizzare
- Digita
EOF
su una riga a sé stante e premi Invio
I terminali e le interfacce della riga di comando non gestiscono bene i caratteri speciali, come hai scoperto. Se non stai molto attento con la formattazione dei documenti, avrai problemi anche con Microsoft Word (e altri) che usano le "virgolette intelligenti ", trattini em, l'elenco potrebbe continuare...
Trova la differenza:(la parte superiore è "virgolette intelligenti ", la parte inferiore è "virgolette semplici ")
$ hexdump -Cv <<"EOF"
> “quoted string”
> EOF
00000000 e2 80 9c 71 75 6f 74 65 64 20 73 74 72 69 6e 67 |...quoted string|
00000010 e2 80 9d 0a |....|
00000014
Qui, le virgolette aperte non sono semplici virgolette ASCII ("
), ma sono una serie Unicode / UTF-8 - 0xE2
, 0x80
, 0x9C
o U+201C
- che il terminale non gestirà come ci si potrebbe aspettare.
Il suggerimento di Kiwy di cat -A
fa anche il lavoro:
$ cat -A <<"EOF"
> “quoted string”
> EOF
M-bM-^@M-^\quoted stringM-bM-^@M-^]$
Nota: quando si usa echo "..." | hd
, hai la possibilità che bash sostituisca parti della stringa che stai tentando di ispezionare. Ciò è particolarmente preoccupante quando si tenta di ispezionare i componenti di uno script.
Ad esempio, prova:
$ echo "${USER}"
attie
$ echo "`whoami`"
attie
$ echo "$(whoami)"
attie
$ cat <<EOF
> ${USER}
> EOF
attie
Questi metodi stanno sostituendo i componenti con il testo pertinente. Per evitare ciò, utilizzare uno dei seguenti approcci. Nota l'uso delle virgolette singole ('
) e un "quoted heredoc " ("EOF"
).
$ echo '${USER}'
${USER}
$ echo '`whoami`'
`whoami`
$ echo '$(whoami)'
$(whoami)
$ cat <<"EOF"
> ${USER}
> EOF
${USER}
echo "<your command>" | hd
dovrebbe funzionare. Cerca backspace (0x08) o caratteri con codici>=80. echo "<your command>" | wc -b
e anche controllare che il conteggio corrisponda a ciò che vedi è una buona idea.
Copiare materiale da file prodotti da qualsiasi cosa con "Office" nel nome è pericoloso, perché tale software spesso si prende la libertà di sostituire i caratteri:in francese, fai attenzione alle doppie virgolette sostituite da "guillemets", in inglese alle virgolette semplici sostituite dalle loro equivalenti apri/chiudi. Il più difficile che abbia mai trovato è stato uno spazio unificatore di larghezza 0 nel mezzo del nome di un file (3 giorni di inattività del server...).