GNU/Linux >> Linux Esercitazione >  >> Linux

Come posso controllare i caratteri letterali di una stringa di comando bash?

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:

  1. Digita hexdump -Cv <<"EOF" e premi Invio
  2. Incolla il testo che desideri utilizzare
  3. 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...).


Linux
  1. Come verificare se Bash può stampare i colori?

  2. Come funziona cat << EOF in bash?

  3. Come posso aggiungere una stringa all'inizio di ogni file in una cartella in bash?

  4. Come posso contare il numero di caratteri in una variabile Bash

  5. Come posso ottenere l'ultimo numero dalla stringa in bash?

Come utilizzare il comando Bash let {con esempi}

Come utilizzare il comando di lettura Bash

Bash Heredoc

Come verificare se una stringa contiene una sottostringa in Bash

Come cambiare rapidamente la prima parola in un comando Bash?

Come posso eseguire manualmente un controllo nagios dalla riga di comando?