GNU/Linux >> Znalost Linux >  >> Linux

Jak mohu zkontrolovat doslovné znaky řetězce příkazu bash?

Můžete použít cat s -A možnost:z návodu:

   -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

Takže cat -A yourscrip.sh vám ukáže neviditelné a podivné postavy.


Jednou z možností je podívat se na postavy, které se pokoušíte použít, pomocí hexadecimálního prohlížeče nebo editoru. hexdump je dobrá volba, pokud jste omezeni na terminál.

$ 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

Zde můžete vidět, že space , close-square-brace , space jsou správné - 0x20 , 0x5D , 0x20 .

Tyto hodnoty jsou kódy ASCII zobrazené v šestnáctkové soustavě. Jakákoli hodnota mimo rozsah 0x20 - 0x7E není "tisknutelný znak ", pokud jde o ASCII, a s největší pravděpodobností si nebude dobře hrát s rozhraními příkazového řádku.

Poznámka: Zkopíroval jsem vaše první „rozbité " řádek pro použití v hexdump příklad výše, takže něco nahradilo není-an-ASCII-mezera s mezerou ASCII mezi původním zdrojem a vykreslenou otázkou.

Chcete-li to zopakovat, proveďte následující kroky:

  1. Zadejte hexdump -Cv <<"EOF" a stiskněte Enter
  2. Vložte text, který chcete použít
  3. Zadejte EOF na samostatném řádku a stiskněte Enter

Terminály a rozhraní příkazového řádku nezvládají dobře speciální znaky - jak jste zjistili. Pokud nejste příliš opatrní s formátováním dokumentů, budete mít také problémy s Microsoft Word (a dalšími) pomocí "chytrých uvozovek ", em-pomlčky, seznam pokračuje...

Poznejte rozdíl:(nahoře je „chytré uvozovky “, dole jsou „rovné uvozovky ")

$ 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

Otevřené uvozovky zde nejsou jednoduché uvozovky ASCII (" ), ale jsou série Unicode / UTF-8 - 0xE2 , 0x80 , 0x9C nebo U+201C - které terminál nezvládne tak, jak byste očekávali.

Kiwyho návrh cat -A také dělá svou práci:

$ cat -A <<"EOF"
> “quoted string”
> EOF
M-bM-^@M-^\quoted stringM-bM-^@M-^]$

Poznámka: při použití echo "..." | hd , máte šanci, že bash nahradí části struny, kterou se pokoušíte zkontrolovat. To je zvláště znepokojivé, když se pokoušíte zkontrolovat součásti skriptu.

Zkuste například:

$ echo "${USER}"
attie

$ echo "`whoami`"
attie

$ echo "$(whoami)"
attie

$ cat <<EOF
> ${USER}
> EOF
attie

Tyto metody nahrazují komponenty příslušným textem. Abyste tomu zabránili, použijte jeden z následujících přístupů. Všimněte si použití jednoduchých uvozovek (' ) a „citovaný heredoc " ("EOF" ).

$ echo '${USER}'
${USER}

$ echo '`whoami`'
`whoami`

$ echo '$(whoami)'
$(whoami)

$ cat <<"EOF"
> ${USER}
> EOF
${USER}

echo "<your command>" | hd měl by pracovat. Hledejte backspace (0x08) nebo znaky s kódy>=80. echo "<your command>" | wc -b a zkontrolovat, zda počet odpovídá tomu, co vidíte, je také dobrý nápad.

Kopírování věcí ze souborů vytvořených čímkoli, co má v názvu „Office“, je nebezpečné, protože takový software si často dovoluje nahradit znaky:ve francouzštině dávejte pozor na dvojité uvozovky nahrazené „guillemets“, v angličtině na obyčejné uvozovky nahrazené jejich otevřené/zavřené ekvivalenty. Nejtěžší, co jsem kdy našel, byla mezera o šířce 0 uprostřed názvu souboru (3 dny výpadku serveru...).


Linux
  1. Jak zkontrolovat, zda Bash může tisknout barvy?

  2. Jak zkontrolovat, zda řetězec obsahuje podřetězec v Bash

  3. Jak funguje cat << EOF v bash?

  1. Jak mohu přidat řetězec na začátek každého souboru ve složce v bash?

  2. Jak přidat ikonu do výzvy bash

  3. Jak mohu přidat řetězec na začátek každého řádku v souboru?

  1. Jak mohu spočítat počet znaků v proměnné Bash

  2. Jak mohu zacyklit výstup příkazu shellu?

  3. Jak nastavit barvu příkazového řádku v Bash?