Máte predstavu o tom, čo môže byť problém?
Môj kód je:
#!/bin/bash
while :
do
echo "Press [CTRL+C] to stop.."
sleep 1
done
Uložilo sa to ako .sh a spustilo sa bash file.sh
CentOS 6 32-bit
Aký je problém? Keď prvýkrát používate BASH, potrebujete jednoduchú nekonečnú slučku na niečo.
odpovede:
19 pre odpoveď č. 1beh cat -v file.sh
.
Pravdepodobne máte vo svojom súbore znak návratu vozíka alebo medzeru bez prerušenia. cat -v
ukáže ich ako ^M
a M-BM-
alebo M-
resp. Podobne sa v nej zobrazia akékoľvek ďalšie podivné znaky, ktoré ste sa do súboru mohli dostať.
Odstráňte konce riadkov systému Windows pomocou
tr -d "r" file.sh > fixedfile.sh
8 pre odpoveď č. 2
Rovnakú chybu som dostal aj na Cygwin; Urobil som toto (jeden z nich to opravil):
- prevedený
TABS
naSPACES
- bežal
dos2unix
na.(ba)sh
súbor
4 pre odpoveď č. 3
Aká je chyba, že ste znovu?
$ bash file.sh
test.sh: line 8: syntax error: unexpected end of file
Ak sa zobrazí táto chyba, môžete mať zlé konce riadkov. Unix používa <LF>
na konci súboru, keď systém Windows používa <CR><LF>
, že <CR>
postava sa interpretuje ako postava.
Môžeš použiť od -a test.sh
aby ste videli neviditeľný znakov v súbore.
$ od -a test.sh
0000000 # ! / b i n / b a s h cr nl # sp cr
0000020 nl w h i l e sp : cr nl d o cr nl sp sp
0000040 sp sp e c h o sp " P r e s s sp [ C
0000060 T R L + C ] sp t o sp s t o p " cr
0000100 nl sp sp sp sp s l e e p sp 1 cr nl d o
0000120 n e cr nl
0000124
Na sp
znamená priestor, ht
je skratka pre kartu, cr
znamenať <CR>
a nl
znamenať <LF>
, Všimnite si, že všetky riadky končia na cr
nasleduje a nl
charakteru.
Môžete tiež použiť cat -v test.sh
Ak tvoj cat
príkaz vezme -v
parameter.
Ak máte dos2unix
vo svojom poli môžete tento príkaz použiť na opravu súboru:
$ dos2unix test.sh
2 pre odpoveď № 4
Táto chyba sa niekedy vyskytuje z dôvodu neočakávaných znakov CR v súbore, zvyčajne preto, že súbor bol vygenerovaný v systéme Windows, ktorý používa zakončenie riadkov CR. Môžete to vyriešiť spustením os2unix
alebo tr
, napríklad:
tr-d "
Týmto sa zo súboru odstránia všetky znaky CR.
1 pre odpoveď č. 5
Otvorte nový súbor s názvom foobar
nano -w foobar
Vstupný skript
#!/bin/bash
while [ 0 = 0 ]; do
echo "Press [CTRL+C] to stop.."
sleep 1
done;
Ukončite a uložte
CTRL+X potom Y a vstúpiť
Nastaviť spustiteľný a spustiteľný skript
chmod +x foobar
./foobar
1 pre odpoveď č. 6
Môže mi pomôcť niekto iný: narazil som na rovnaké problémy, keď som urobil nejakú „kópiu-prilepenie“ z bočného dokumentu programu Microsoft Word, kde som si robil poznámky, do svojich skriptov skriptu.
Ručné prepisovanie presne toho istého kódu v skripte to len vyriešilo.
Spočiatku to bolo celkom nezrozumiteľnéProblémom boli skryté znaky a / alebo formátovanie slova. Zjavné, ale neviditeľné ... Stratil som o tom asi hodinu (bez odborníka na škrupiny, ako by ste mohli hádať ...)
0 pre odpoveď č. 7
Upravte svoj kód v akomkoľvek prostredí Linuxu, potom sa vám tento problém nevyrieši. Ak ho upravujete v systéme Windows Poznámkový blok ľubovoľný priestor vezmite ako ^ M.
0 pre odpoveď č. 8
Mám presne tú istú otázku ako vyššie a vzal som juCelý deň ma zistil, že sa mi nepáči môj nový riadok. Namiesto toho som namiesto toho znova použil rovnaký kód s bodkočiarkou. Napríklad môj počiatočný kód používajúci nový riadok (ktorý spôsobil rovnakú chybu ako váš):
Y=1
while test "$Y" -le "20"
do
echo "Number $Y"
Y=$[Y+1]
done
A pomocou kódu s bodkočiarkou prístup s opracovaným zázrakom:
Y=1 ; while test "$Y" -le "20"; do echo "Number $Y"; Y=$[Y+1] ; done
Všimol som si, že rovnaký problém sa vyskytuje aj v prípade iných príkazov, ktoré používajú prístup k novému riadku, takže si myslím, že sa pri svojom budúcom kóde budem venovať bodkočiarke.
0 pre odpoveď č. 9
Je možné, že tento problém získate bez zmiešaných problémov s novým riadkom (prinajmenšom v mojom prostredí, ktoré je GNU bash v4.3.30):
#!/bin/bash
# foo.sh
function foo() {
echo "I am quoting a thing `$1" inside a function."
}
while [ "$input" != "y" ]; do
read -p "Hit `y" to continue: " -n 1 input
echo
done
foo "What could possibly go wrong?"
$ ./foo.sh
./foo.sh: line 11: syntax error near unexpected token `done"
./foo.sh: line 11: `done"
Dôvodom je, že bash rozširuje backticks vnútri reťazcov s dvojitými citáciami (pozri príručku k bash citovať a substitúcia príkazov) a predtým, ako nájde zodpovedajúci backtick, interpretuje všetky ďalšie dvojité úvodzovky ako súčasť nahradenia príkazu:
$ echo "Command substitution happens inside double-quoted strings: `ls`"
Command substitution happens inside double-quoted strings: foo.sh
$ echo "..even with double quotes: `grep -E "^foo|wrong" foo.sh`"
..even with double quotes: foo "What could possibly go wrong?"
Môžete to obísť tak, že uniknete backticks vo vašom reťazci so spätným lomítkom, alebo použijete reťazec s jednoduchým citátom.
Nie som si celkom istý, prečo to dáva iba jednu chybovú správu, ale myslím si, že to súvisí s definíciou funkcie:
#!/bin/bash
# a.sh
function a() {
echo "Thing"s `quoted""
}
a
while true; do
echo "Other `quote""
done
#!/bin/bash
# b.sh
echo "Thing"s `quoted""
while true; do
echo "Other `quote""
done
$ ./a.sh
./a.sh: line 10: syntax error near unexpected token `done"
./a.sh: line 10: `done"
$ ./b.sh
./b.sh: command substitution: line 6: unexpected EOF while looking for matching `""
./b.sh: command substitution: line 9: syntax error: unexpected end of file
Thing"s quote"
./b.sh: line 7: syntax error near unexpected token `done"
./b.sh: line 7: `done"