Opravit chybu syntaxe Bash poblíž neočekávaného tokenu

Kódování v terminálu Linux Bash se stalo běžnou praxí v programátorské komunitě. Softwaroví inženýři i studenti, kteří se učí programovací jazyky, se často setkávají s různými chybami. Pokud jste se opakovaně setkali s chybami jako je „chyba syntaxe u neočekávaného tokenu ‚(‚“ nebo „chyba syntaxe Bash u neočekávaného tokenu“, můžete vyzkoušet metody popsané v tomto článku a stát se zkušeným kodérem. Projděte si níže uvedené postupy a opravte chyby v příkazových řádcích vašeho skriptu.

Jak řešit chybu syntaxe Bash s neočekávaným tokenem

Linux Bash je interpret příkazového řádku pro systémy založené na Linuxu a slouží jako náhrada za Bourne Shell (sh). Skripty v Linux Bash jsou obvykle pojmenovány s příponou .sh. Pokud váš kód ve skriptu shellu obsahuje problémy s formátováním, může dojít k chybě syntaxe. Když se chyba týká znaku „(„, shell vás upozorní na problém v daném řádku a vypíše chybovou zprávu. Protože Bash je interpret, řádek s chybou se zobrazí v Terminálu a skript přestane pokračovat ve zpracování dalších příkazů. Chcete-li vyřešit chybu neočekávaného tokenu, musíte opravit chybu v konkrétním příkazovém řádku a pokračovat v dalším. Níže jsou uvedeny nejčastější příčiny chyb syntaxe u neočekávaného tokenu v Linux Bash:

  • Použití escape sekvencí: Nesprávné použití escape sekvencí nebo uvozovek ve skriptu Bash může způsobit chyby. Pro nápravu je nutné zajistit, aby byly escape sekvence a uvozovky zapsány ve správném formátu.

  • Neplatná syntaxe kódu: Chybná syntaxe, jako je nesprávné pořadí smyček, může vést k chybám syntaxe.

  • Chybné použití příkazů: Pokud příkaz používáte nesprávně, například při chybném přiřazování hodnot, může to také způsobit chybovou zprávu.

  • Nekompatibilní OS: Pokud skript není kompatibilní mezi systémy Unix a DOS, může dojít k neočekávané chybě.

  • Problémy se skriptem: Potíže mohou nastat, pokud je bash skript spuštěn ze souboru zkopírovaného z jiného systému, což může vyvolat neočekávanou chybu tokenu.

Pro ilustraci, uvažujme soubor s názvem example.sh vytvořený v Linux Bash, který obsahuje následující příkazové řádky. Tento soubor má potenciální syntaktické chyby a zahrnuje různé příkazy, které lze v shell skriptu použít.

str= ‘První příkazový řádek ‘(ukázkový soubor)’ ve skriptu’
str= [(1,2),(3,4)]
if[ $den == “pon” ] then
 echo “pon”
else
 echo “ne pon”
fi
for PROMĚNNÁ in {0..2}; then
do echo prikaz1; echo prikaz2; echo prikaz3; echo prikaz4; done
while true; do if [ $den == “pon” ]; then echo “pon”; else echo “ne pon”; done; fi

Metoda 1: Manuální oprava chyb v každém řádku

Jednou z možností, jak řešit chyby, je ruční oprava syntaxe v jednotlivých řádcích skriptu. V této části jsou popsány kroky pro řešení chyb syntaxe v blízkosti neočekávaného tokenu v příkazových řádcích. Níže je popsán proces opravy neočekávané chyby tokenu v terminálu. Spusťte soubor v terminálu příkazem ./example.sh a stiskněte Enter.

2. Zaznamenejte si řádky s neočekávanou chybou tokenu, které se zobrazí ve výstupu.

3. Opravte chybu v každém řádku podle metod popsaných níže a uložte soubor.

4. Po provedení změn znovu spusťte soubor a ověřte, zda se chyba syntaxe vyřešila.

Krok I: Zobrazení obsahu souboru

Prvním krokem k opravě chyby syntaxe v příkazových řádcích je načtení souboru v Terminálu. Pokud má soubor problémy, nemusí být jeho obsah zobrazen. Běžnou praxí je spuštění souboru příkazem ./example.sh, avšak tímto způsobem nelze upravovat obsah souboru. Možnosti, jak zobrazit obsah souboru a upravit řádky za účelem opravy chyby syntaxe u neočekávaného tokenu ‚(‚, jsou popsány níže.

Možnost 1: Příkaz CAT

První možností je použití příkazu cat k zobrazení obsahu skriptu shellu. Obsah souboru s neočekávanou chybou tokenu zobrazíte příkazem cat -v example.sh v Terminálu.

Poznámka 1: example.sh se používá pro ilustrační účely. Měli byste použít název souboru, který vyvolává chybu.

Poznámka 2: Příkaz cat -v zobrazuje všechny neviditelné znaky, které mohou představovat návrat vozíku nebo mezeru bez přerušení.

Možnost 2: Příkaz VX

Pokud příkaz cat nemůžete použít, můžete vyzkoušet příkaz vx pro zobrazení a úpravu příkazů v souboru. Soubor otevřete zadáním sh -vx ./example.sh do Terminálu.

Možnost 3: Příkaz od -a

Pokud se v příkazových řádcích nachází více neviditelných znaků, můžete soubor zobrazit pomocí příkazu od -a. Jestliže obsah souboru není v kódu vidět, zkuste jej načíst pomocí příkazu od -a example.sh a upravte kód.

Krok II: Odstranění konců řádků systému Windows

Pokud má skript konce řádků ve stylu Windows, můžete pomocí příkazů v konzoli tyto konce odstranit a zkopírovat kód do nového souboru, čímž se chyba opraví.

Zadejte následující příkaz do Terminálu pro uložení obsahu souboru do nového souboru s názvem correctedexample.sh, čímž se odstraní konce řádků ve stylu Windows:

tr –d ‘r’ <example.sh> correctedexample.sh

Krok III: Nastavení práv k nově vytvořenému souboru

Nově vytvořenému souboru je nutné nastavit práva pro úpravy, aby bylo možné soubor spustit v prostředí shellu. Zadejte do Terminálu příkaz chmod 755 correctedexample.sh, čímž udělíte oprávnění k souboru a spustíte jej. Nyní můžete zobrazit opravený soubor, opravit problémy s formátováním a vyřešit chybu syntaxe poblíž neočekávaného tokenu ‚(‚.

Krok IV: Formátování kódu v souboru

Dalším krokem je formátování řádků kódu a ruční úprava jednotlivých příkazů v souboru. Možnosti formátování souboru pro opravu chyby syntaxe u neočekávaného tokenu ‚(‚ jsou popsány v této části.

Možnost 1: Nahrazení jednoduchých uvozovek dvojitými

Pokud používáte v příkazových řádcích jednoduché uvozovky, je nutné je nahradit dvojitými uvozovkami. V souboru example.sh odstraňte řádky kódu s jednoduchými uvozovkami a nahraďte je dvojitými uvozovkami („). Například v ukázkovém souboru musíte změnit kód na str= „První příkazový řádek „(ukázkový soubor)“ ve skriptu“.

Poznámka: Dvojité uvozovky jsou nezbytné pro příkazy typu parametru, jako je str= „[(1,2),(3,4)]“.

Možnost 2: Přidání $ k řetězcovým řádkům

Pokud jste do skriptu přidali hodnoty řetězců, je třeba přidat $ k hodnotám řetězců pro vyřešení chyby syntaxe. Přidejte $ pro příkazové řádky s hodnotami řetězců, abyste chybu odstranili. Zde v ukázkovém souboru změňte řádek na:

str= $ ‘První příkazový řádek ‘(ukázkový soubor)’ ve skriptu’

Poznámka: Pokud v řetězcové hodnotě používáte $, můžete obejít sekvenci escape zpětného lomítka, protože příkazové řádky se dekódují podle standardu ANSI C. Jinými slovy, použitím $ pro hodnotu řetězce se můžete vyhnout použití dvojitých uvozovek místo jednoduchých v příkazových řádcích.

Možnost 3: Převod tabulátorů na mezery

Mezery mezi příkazy by měly být mezery, ne tabulátory. To pomáhá opravit syntaktické chyby. Pokud se chyba objevuje v Cygwinu, zkuste převést tabulátory na mezery. Například řádek:

do echo prikaz1;    echo prikaz2;         echo prikaz3;         echo prikaz4;         done

by měl být přepsán takto:

do echo prikaz1; echo prikaz2; echo prikaz3; echo prikaz4; done

Možnost 4: Použití escape znaků

Je důležité používat escape znaky spolu s bash znaky. Závorky ( ) jsou speciální bash znaky, proto je nutné použít escape znak (zpětné lomítko), aby se zrušilo jejich speciální chování. Například str= ‚První příkazový řádek ‚(ukázkový soubor)‘ ve skriptu‘ by nemělo způsobovat chybu, protože escape znak se zde používá.

Možnost 5: Použití mezer mezi znaky

Shell skript rozpoznává příkazy a konstrukce na základě mezer mezi nimi. Je nutné zajistit správné použití mezer, aby shell mohl příkaz identifikovat. Mezera se používá k rozlišení dvou znaků v příkazovém řádku. Pokud v kódu není mezera mezi „if“ a „[„, způsobí to neočekávanou chybu tokenu, protože shell příkaz „if[“ nerozpozná. Pokud změníte kód na „if [ $den == „pon“ ];“, může být chyba vyřešena, protože shell rozpozná příkaz.

Možnost 6: Použití oddělovačů příkazů

Různé příkazy v shell skriptu musí být odděleny, aby terminál mohl identifikovat jednotlivé příkazy. K opravě chyby syntaxe musíte použít oddělovač příkazů. Příkazy je nutné oddělit středníkem (;) nebo novým řádkem. Například příkaz if [ $den == „pon“ ] then by se měl změnit na if [ $den == „pon“ ]; then. Středník se používá jako oddělovač příkazů, což pomáhá chybu opravit.

Možnost 7: Odstranění nadbytečných příkazů

Někdy se do kódu mohou dostat nadbytečné příkazy nebo může dojít k promíchání kódů v případě vícenásobných vnořených smyček. Nadbytečné příkazy je nutné odstranit, aby se chyba syntaxe odstranila. Bash smyčky „for…done“ a konstrukce „if…fi“ musí být v platné syntaxi. Ukázkový soubor má nesprávnou syntaxi ve smyčce „for“, kde se nachází „then“, které se používá v příkazu „if“. Změna kódu podle následujícího příkladu chybu opraví. Příkaz „then“ je nadbytečný a jeho odstranění chybu vyřeší.

for PROMĚNNÁ in {0..2}; do echo prikaz1; echo prikaz2; echo prikaz3; echo prikaz4; done 

Možnost 8: Zajištění správného pořadí uzavírání příkazů

Při použití vícenásobně vnořených nebo podmíněných konstrukcí je nutné zajistit, aby byly smyčky uzavřeny ve správném pořadí. K zamezení konfliktů se smyčkami můžete použít nový řádek. Pořadí uzavírání vnořených smyček a podmínek by mělo být správné. Ve výše uvedeném kódu je cyklus „while true; do if [ $den == „pon“ ]; then echo „pon“; else echo „ne pon“; done; fi“ nutné uzavřít ve správném pořadí. Úprava kódu podle následujícího příkladu chybu odstraní, protože se opraví pořadí uzavírání příkazů.

while true; do if [ $den == “pon” ]; then echo “pon”; else echo “ne pon”; fi; done

Metoda 2: Přepsání kódu

Pokud jste kód zkopírovali a vložili do terminálu, zkuste ho ručně přepsat, abyste se vyhnuli chybám. Pokud kód napíšete bez chyb ve formátování, je pravděpodobné, že se chyba vyřeší. Skryté znaky nebo problémy s formátováním v textových editorech jako Microsoft Word, které jste mohli použít ke zkopírování kódu, mohly být příčinou chyb.

Metoda 3: Příkaz Dos2unix.exe

V operačním systému Unix se k přesunu na nový řádek používá znak posunu řádku „\n“. V operačním systému Windows se pro stejný účel používá znak návratu vozíku a posunu řádku „\r\n“. Pokud v Cygwinu spouštíte kód napsaný v OS Windows, může dojít k chybě syntaxe u neočekávaného tokenu ‚(‚.

K nápravě této chyby musíte odstranit znak návratu vozíku pomocí nástroje pro příkazový řádek DOS na Unix, který je převodníkem formátu textového souboru. Zadejte do Terminálu příkaz „dos2unix.exe example.sh“ pro převod souboru do formátu Unix.

***

Článek popisuje základní metody pro opravu chyby syntaxe Bash poblíž neočekávaného tokenu ‚(‚ ve skriptu. Pokud používáte Linux Bash, můžete použít tyto postupy k odstranění této chyby. Pokud vám tento článek pomohl, neváhejte se podělit o vaše návrhy a dotazy v sekci komentářů.