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:
- Zadejte
hexdump -Cv <<"EOF"
a stiskněte Enter - Vložte text, který chcete použít
- 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...).