Basteln eines Shell Scripts!

wanted

wanted

Jungspund
Hallo Leute,

Ich bins mal wieder ;) Der Anfänger :D
Also ich lebe mich schön langsam richtig ein was Shell betrifft und macht Spaß damit zu arbeiten!

Jetzt würde ich gerne etwas testen, weiß aber leider nicht genau wie das funktioniert! :( Hoffentlich könnt ihr mir weiterhelfen bzw. einen Denkanstoß geben!

Ich möchte ein Shell Script schreiben (abc.sh)! Dieses Shell Script soll ein Textfile erstellen (text.txt) und den Inhalt der Datei /etc/neu in das Textfile kopieren!

So anschließend sollen alle Zeilen von text.txt ausgegeben werden, deren Zeilennummer eine Primzahl ist! (Es soll zuerst die Zeilennummer und
dann der Inhalt der Zeile ausgegeben werden)

Hört sich eigentlich super an, jedoch reichen meine Kenntnisse einfach noch nicht ganz aus!

Ich hätte es einmal so angefangen:

1) vi abc.sh
#!bin/sh
touch text.txt
cat /etc/neu >> text

Das wäre einmal meine abc.sh! Hab ich da schon einen Fehler?

Doch wie löse ich das dann mit den Primzahlen? Das würde ich scheitern wenn ich nicht schon oben gescheitert bin :D

Hoffe mir kann jemand weiterhelfen!
Danke vielmals!

Lg
wanted
 
Code:
#!/bin/sh
cat /etc/neu > text.txt

Das reicht bereits aus, das File muss nicht erst erstellt werden.
 
Hoffentlich könnt ihr mir weiterhelfen bzw. einen Denkanstoß geben!

Na dann kriegst du doch mal ein paar Denkanstöße:

- Zeilenweise Datei einlesen:

Code:
while read....

(Rest siehe google)

- Zeilennummer rauskriegen: Lass einfach einen counter bei "while read" mitlaufen.

- Primzahlen: Eigentlich recht einfach, du musst ja nur den counter auf Teilbarkeit prüfen.
bc ist dein Freund, also dringend mal lesen:

Code:
man bc
 
Mit factor gehts aber einfacher....
Keine Primzahl wenn der zweite Faktor existiert....
Code:
$ factor 100
100: 2 2 5 5
Primzahl wenn der zweite Faktor leer ist....
Code:
$ factor 17
17: 17
 
Sample Code:
auszurufen mit ./script.sh namederdatei namederzweitendatei
Code:
#!/bin/bash

FILE1=$1
FILE2=$2
LINR=1
#
function testprime {
#1 und 0 sind keine Primzahlen!

if [[ $1 -eq 1 || $1 -eq 0 ]]
then
        return 1
fi
#Array
FAK=( $(factor $1) )
#Wenn leer dann....
if [ -z "${FAK[2]}" ]
then
        #Es ist eine Primzahl
        return 0
else
        #Keine Primzahl
        return 1
fi
}

cp $FILE1 $FILE2
echo "Total lines: `wc -l $FILE2`"
sleep 2
while read LINE
do
`testprime $LINR`
if [ $?  -eq 0 ]
then
        #echo "$LINR ist eine Primzahl"
        echo "$LINR : $LINE"
#else

        #echo "$LINR ist keine Primzahl"
fi
LINR=`expr ${LINR} + 1`


done < $FILE2
 
Zuletzt bearbeitet:
Danke vielmals für eure Unterstützung! Echt spitze!

@beomuex: Der Sample Code den du hier erstellt hast, ist das mein Beispiel im ersten Posting? Bzw. genau nach den Angaben die ich gegeben habe oder hat es auch was mit Primzahlen zu tun, und ist aber einfach nur ein frei gewähltes Beispiel? Wenn es ident zu meinem ist,was ich mir denke wenn ich mir den Code so ansehe, dann hätte ich einige Fragen dazu!

Danke supersucker für deinen Lösungsvorschlag aber wenn der "factor" Vorschlag von beomuex einfacher ist, werde ich es mit diesem Versuchen!

Also bitte gib mir bescheid!
Danke, danke, danke ---> Ihr seit die Besten!

Lg
wanted
 
@beomuex: Der Sample Code den du hier erstellt hast, ist das mein Beispiel im ersten Posting? Bzw. genau nach den Angaben die ich gegeben habe oder hat es auch was mit Primzahlen zu tun, und ist aber einfach nur ein frei gewähltes Beispiel? Wenn es ident zu meinem ist,was ich mir denke wenn ich mir den Code so ansehe, dann hätte ich einige Fragen dazu!

Das ist ein on-demand Script :D

Exakt nach deinen Vorgaben erstellt. :devil:

Wenn du willst poste ich auch ne vollkommentierte Version....

Gruß

beomuex
 
Das wäre super hilfreich von dir!
Ansonsten würde ich eben meine 1000Fragen posten die sich aber vielleicht aufklären mit einer vollkommentierten Version!

Wäre spitze!

lg
 
Kopier das am besten in nen Editor der Syntax-Highlighting hat (vi,emacs, kate, kwrite, geany, quanta etc)

Code:
#!/bin/bash                                        
#Parameter 1 ist die org. Datei                    
FILE1=$1
#Parameter 2 ist die neue Datei
FILE2=$2
#Counter wird auf 1 gesetzt
LINR=1
#
#Funktion, die prüft ob der Parameter mit dem sie aufgerufen wird eine Primzahl ist

function testprime {

#Wenn der Parameter ($1) 0 oder 1 ist würde die untere if Abfrage 0, sprich Primzahl ausgeben, da 0 und 1 aber per Definition keine Primzahlen sind,
#gibt die folgende if Abfrage den return-Wert 1 (keine Primzahl zurück)
if [[ $1 -eq 1 || $1 -eq 0 ]]
then
        return 1
fi
#Wir definieren das Array FAK (für Faktor)
FAK=( $(factor $1) )
#Wenn die zweite Stelle des Arrays leer ist, dann ist es eine Primzahl, da es nur den 1. Teiler gibt
# ==> -z == leer ; ${FAK[2]} == Wert der zweiten Stelle des Arrays FAK
if [ -z "${FAK[2]}" ]
then
        #Es ist eine Primzahl
        return 0
else
        #Keine Primzahl
        return 1
fi
}
#Kopieren des FILE1 nach FILE2
cp $FILE1 $FILE2
#Zählen aller Lines
echo "Total lines: `wc -l $FILE2`"
#Sonst sieht man nix ;-)
sleep 2
#Während wir von $FILE2 eine LINE bekommen(ganz am Schluss bei done < $FILE2), machen wir....
while read LINE
do
#übergeben der aktuellen Liniennummer als Parameter an die Funktion testprime (siehe oben)
`testprime $LINR`
#Wenn der Rückgabewert gleich 0 ist dann
if [ $?  -eq 0 ]
then
        #"$LINR ist eine Primzahl"
        echo "$LINR : $LINE"
#else
#wenn nicht, sprich wenn der return wert 1 ist
        #"$LINR ist keine Primzahl"
fi
#Der Counter LINR wird um eins erhöht....
LINR=`expr ${LINR} + 1`


done < $FILE2
 
Zuletzt bearbeitet:
Statt
Code:
`foo_funtion`
if [ $? -eq 0]; then
    #....
geht auch einfach:
Code:
if foo_function; then
    #...

Warum du eine keinen Output generierende Funktion per Command Substitution (in einer Subshell) ausführst, weiß ich nicht. Aber ich weiß ja vieles nicht.
Auch kann man das imho kompakter (ohne extra Funktion-Boilerplate) mit awk machen (dann auch mit cmd-Substi)
Code:
for i in {1..50}; do
    [ -z "$(factor $i|awk '{print $3}')" ] && echo "$i is prime."
done
Und wenn du schon Funktionen nutzt, lokalisiere die Variablen lieber.
Code:
LINR=`expr ${LINR} + 1`
kann man in bash mit builtin Integer-Arithmetik machen:
Code:
((LINR++))
 
Danke für die Tipps, aber ob ich das jetzt mit nem awk mach und hundertausend Klammern und Pipes oder über ein Array und eine if ist ja Wurst.
Und expr und ((i++)) sind wohl genauso schnell ;-)

BTW:

Die Zeile 7 muss LINR=1 anstatt LINR=0 lauten.
Sonst bekommt man immer die Zeile VOR der Zeile, deren Zeilennummer eine Primzahl ist.
 
Hi,

Und expr und ((i++)) sind wohl genauso schnell ;-)

nope, expr ist soweit ich weiss keine built-in function, so dass du jedesmal einen neuen Prozess dafuer startest, was deutlich langsamer ist als das built-in zu benutzen.

mfg,
bytepool
 
nope, expr ist soweit ich weiss keine built-in function, so dass du jedesmal einen neuen Prozess dafuer startest, was deutlich langsamer ist als das built-in zu benutzen.
Nicht nur das: Die Backticks (cmd-Substitution) starten auch noch mal'n bash fork. Also effektiv zwei extra Prozesse statt null. :T
Code:
$ foo=0; time for i in {1..1000}; do foo=`expr $foo + 1`; done

real    0m6.168s
user    0m2.575s
sys     0m3.184s
$ foo=0; time for i in {1..1000}; do ((foo++)); done

real    0m0.044s
user    0m0.023s
sys     0m0.000s
Aber es ging mir nichtmal um performance, nur um Kosmetik. Weil das imho lesbarer ist. Das gleiche gilt für den awk oneliner. Imho einfacher zu sehen was vorgeht, weil man nicht im Skript hin und herspringen muss. (Wo ist die Funktion? Was sind die Übergabewerte? Was wird zurückgegeben?)
 
Zuletzt bearbeitet:
Hallo Leute,

Erstmal ein ganz fettes DANKESCHÖN an dich beomuex! Ich werd mir dein Shell Script morgen genau anschauen und wenn ich fragen noch habe, dann hoff ich,dass ich diese hier posten kann und eine Antwort bekomme!

@Gott in schwarz:
Find ich nett,dass du noch Verbesserungen angibst aber so wie es beomuex geschrieben hat, ist es für mich verständlicher da ich von Array und if momentan noch mehr Ahnung habe als von sonstigem was man noch machen kann! Für mich ist es momentan nur wichtig,dass es läuft und das ich es verstehe und einmal die Grundkenntnisse ein wenig trainiere! Die einfacheren,besseren und schnelleren Wege werden später folgen!

Vielen dank nochmals und wenn ich noch fragen habe, poste ich diese morgen ;)

Euch noch einen schönen Abend!

Lg
wanted
 
Hallo,

Also ich habe mir dein Script genauer angeschaut und es sind dennoch fragen offen,sodass ich das Script auch wirklich zu 100% verstehe! Hoff du kannst mir weiterhelfen..

FILE1=$1 ist die Originaldatei sprich bei mir die /etc/neu Datei richtig?
FILE=$2 ist die neue Datei sprich bei mir die text.txt hab ich damit recht?

Du hast außerdem den Counter auf 1 gesetzt! Wieso ausgerechnet auf 1?
LINR=1

Du hast außerdem geschrieben:
#Wenn die zweite Stelle des Arrays leer ist, dann ist es eine Primzahl, da es nur den 1. Teiler gibt
# ==> -z == leer ; ${FAK[2]} == Wert der zweiten Stelle des Arrays FAK
Was bitte genau meinst du damit? Die zweite Stelle des Arrays...was ist die zweite Stelle und wieso nur den 1.Teiler? Und wofüur genau steht dieses -z jetzt?

Weiter unten hast du dann geschrieben:
Wieso macht man das? Ist das wichtig?

Am Schluss steht, der Counter LINR wird um eins erhöht... Wieso das?
Und die letzte Zeile ist

Was macht diese Zeile genau?

Vielen dank für deine Hilfe und sicherlich hören sich meine Fragen ein wenig dumm an, dennoch würde ich das ganze Script gerne zu 100% verstehen!

Lg
wanted

EDIT: Btw ich bastel das Script in sh wenn das weiterhelfen sollte!
 
Zuletzt bearbeitet:
Hi, also ich fang mal an.....


FILE1=$1 ist die Originaldatei sprich bei mir die /etc/neu Datei richtig?
FILE=$2 ist die neue Datei sprich bei mir die text.txt hab ich damit recht?

Jop du würdest das Programm zB mit ./script.sh /etc/neu text.txt starten
Zur Erklärung: $n gibt dir den n-ten Parameter

Du hast außerdem den Counter auf 1 gesetzt! Wieso ausgerechnet auf 1?
LINR=1
Weil jede Textdatei bei Zeile 1 beginnt und nicht bei 0 ;-)

Was bitte genau meinst du damit? Die zweite Stelle des Arrays...was ist die zweite Stelle und wieso nur den 1.Teiler? Und wofüur genau steht dieses -z jetzt?

Die "1ste" Stelle eines Arrays ist array[0] , die zweite array[1] usw also quasi n-te Stelle vom Array=array[n-1]

So um dir das zu verdeutlichen:
Code:
#!/bin/bash
echo "Gesamte Ausgabe von factor:  `factor $1`"
FAK=( $(factor $1) )
echo "Erste Stelle ${FAK[0]}  Zweite Stelle ${FAK[1]}  Dritte Stelle ${FAK[2]}"

Wenn du jetzt zum Beispiel eingibst:
Code:
./array.sh 35
Gesamte Ausgabe von factor:  35: 5 7
Erste Stelle 35:  Zweite Stelle 5  Dritte Stelle 7
Code:
 ./array.sh 17
Gesamte Ausgabe von factor:  17: 17
Erste Stelle 17:  Zweite Stelle 17  Dritte Stelle

Siebzehn ist eine Primzahl, deswegen gibt es nur 17 als "Teiler"
35 ist keine Primzahl und lässt sich durch 5 und 7 teilen ==> 2ter Teiler Vorhanden.Wenn der Zweite Teiler, sprich die dritte Stelle des Arrays leer ist , ist es eine Primzahl.

man test schrieb:
-z STRING
the length of STRING is zero

-z bedeutet mit der if Abfrage verbunden, wenn die Variable/Stelle im Array
zero (sprich leer ist) dann mache irgendwas.
Für so ziemlich jede Sache gibt es ne Abfrage, siehe "man test"

Zu dem Counter:

Das Script läuft in etwa so ab:

Code:
Counter=1
Kopiere die datei1 nach datei2

Öffne nun die Datei2 und lese sie Zeile für Zeile aus bis du am Ende der Datei angelangt bist
#OBEN
wenn der counter (die zeilennummer) eine Primzahl ist, dann gib aus:

Zeilennummer : Inhalt der Zeile

Wenn nicht, tue nichts

Erhöhe nun den Counter sprich die Zeilennummer um 1

Springe nun wieder nach OBEN und lese die nächste zeile aus

So.. nun noch die
Code:
done < $file2
, das bedeutet einfach, dass die
Code:
while read LINE
$file2 einliest.

Ich hoffe ich hab nix vergessen *G*

Gruß

beomuex
 
Hallo,

Vielen dank für deine Erklärung, aber ich bringe das Script einfach nicht zum laufen :( Den Fehler finde ich einfach nicht!

Ich versuchs dir zu erklären:
Also ich habe zunächst einmal einfach deine Datei kopiert und FILE1 usw. mit meinen Daten ersetzt. Wenn ich nun das Script aufrufe mit: ./script /etc/xpdfrc prim.txt dann kommen diese Fehlermeldungen:

./script.sh: line 3: /etc/xpdfrc=/etc/xpdfrc: No such file or directory
./script.sh: line 5: prim.txt=prim.txt: command not found
./script.sh: line 51: syntax error near unexpected token `<'
./script.sh: line 51: `done < $prim.txt'

Den Ordner /etc/xpdfrc gibt es zu 100% und die CHMOD sind auch richtig gesetzt. Dasselbe bei der prim.txt! Was habe ich falsch? Hier der Code:

#!/bin/bash
#Parameter 1 ist die org. Datei
/etc/xpdfrc=$1
#Parameter 2 ist die neue Datei
prim.txt=$2
#Counter wird auf 1 gesetzt
LINR=1
#
function testprime {

if [[ $1 -eq 1 || $1 -eq 0 ]]
then
return 1
fi
#Wir definieren das Array FAK (für Faktor)
FAK=( $(factor $1)
if [ -z "${FAK[2]}" ]
then
#Es ist eine Primzahl
return 0
else
#Keine Primzahl
return 1
fi
}
#Kopieren des FILE1 nach FILE2
cp $/etc/xpdfrc $prim.txt
#Zählen aller Lines
echo "Total lines: `wc -l $prim.txt`"

sleep 2

while read LINE
do

`testprime $LINR`
#Wenn der Rückgabewert gleich 0 ist dann
if [ $? -eq 0 ]
then
#"$LINR ist eine Primzahl"
echo "$LINR : $LINE"
else

"$LINR ist keine Primzahl"
fi
#Der Counter LINR wird um eins erhöht....
LINR=`expr ${LINR} + 1`

done < $prim.txt

So nun hab ich lediglich das:

geändert in:

Und dann kommen diese Fehlermeldungen:
./script.sh: /etc/xpdfrc=/etc/xpdfrc: not found
./script.sh: prim.txt=prim.txt: not found
./script.sh: function: not found
./script.sh: [[: not found
/etc/xpdfrc: cidToUnicode: not found
/etc/xpdfrc: unicodeMap: not found
/etc/xpdfrc: unicodeMap: not found
/etc/xpdfrc: unicodeMap: not found
/etc/xpdfrc: cMapDir: not found
/etc/xpdfrc: toUnicodeDir: not found
/etc/xpdfrc: displayCIDFontX: not found
/etc/xpdfrc: cidToUnicode: not found
/etc/xpdfrc: unicodeMap: not found
/etc/xpdfrc: unicodeMap: not found
/etc/xpdfrc: cMapDir: not found
/etc/xpdfrc: toUnicodeDir: not found
/etc/xpdfrc: displayCIDFontX: not found
/etc/xpdfrc: unicodeMap: not found
/etc/xpdfrc: unicodeMap: not found
/etc/xpdfrc: cidToUnicode: not found
/etc/xpdfrc: unicodeMap: not found
/etc/xpdfrc: unicodeMap: not found
/etc/xpdfrc: unicodeMap: not found
/etc/xpdfrc: cMapDir: not found
/etc/xpdfrc: toUnicodeDir: not found
/etc/xpdfrc: displayCIDFontX: not found
/etc/xpdfrc: cidToUnicode: not found
/etc/xpdfrc: unicodeMap: not found
/etc/xpdfrc: cMapDir: not found
/etc/xpdfrc: toUnicodeDir: not found
/etc/xpdfrc: displayCIDFontX: not found
/etc/xpdfrc: unicodeMap: not found
/etc/xpdfrc: nameToUnicode: not found
/etc/xpdfrc: unicodeMap: not found
/etc/xpdfrc: unicodeMap: not found
./script.sh: syntax error at line 17: `FAK=' unexpected

Ich muss das Script jedoch so schreiben, dass oben
#!/bin/sh
steht!

Ich bin echt am verzweifeln! Da hätte ich das komplette Script fast verstanden und dann sowas :(

Falls es dich noch interessiert, der Inhalt der /etc/xpdfrc ist das:
#----- begin Chinese Simplified support package (2002-apr-18)
cidToUnicode Adobe-GB1 /usr/share/xpdf/chinese-simplified/Adobe-GB1.cidToUnicode
unicodeMap ISO-2022-CN /usr/share/xpdf/chinese-simplified/ISO-2022-CN.unicodeMap
unicodeMap EUC-CN /usr/share/xpdf/chinese-simplified/EUC-CN.unicodeMap
unicodeMap GBK /usr/share/xpdf/chinese-simplified/GBK.unicodeMap
cMapDir Adobe-GB1 /usr/share/xpdf/chinese-simplified/CMap
toUnicodeDir /usr/share/xpdf/chinese-simplified/CMap
displayCIDFontX Adobe-GB1 "-*-fangsong ti-medium-r-normal-*-%s-*-*-*-*-*-gb2312.1980-0" ISO-2022-CN
#----- end Chinese Simplified support package

#----- begin Chinese Traditional support package (2002-apr-14)
cidToUnicode Adobe-CNS1 /usr/share/xpdf/chinese-traditional/Adobe-CNS1.cidToUnicode
unicodeMap Big5 /usr/share/xpdf/chinese-traditional/Big5.unicodeMap
unicodeMap Big5ascii /usr/share/xpdf/chinese-traditional/Big5ascii.unicodeMap
cMapDir Adobe-CNS1 /usr/share/xpdf/chinese-traditional/CMap
toUnicodeDir /usr/share/xpdf/chinese-traditional/CMap
displayCIDFontX Adobe-CNS1 "-*-fixed-medium-r-normal-*-%s-*-*-*-*-*-big5-0" Big5
# If you have the Arhpic fonts, you may want to use this instead:
# displayCIDFontX Adobe-CNS1 "-arphic-ar pl kaitim big5-medium-r-normal--%s-*-*-*-c-*-iso10646-1" UCS-2
#----- end Chinese Traditional support package

#----- begin Cyrillic support package (2002-jan-16)
unicodeMap KOI8-R /usr/share/xpdf/cyrillic/KOI8-R.unicodeMap
#----- end Cyrillic support package

#----- begin Greek support package (2002-feb-13)
unicodeMap ISO-8859-7 /usr/share/xpdf/greek/ISO-8859-7.unicodeMap
#----- end Greek support package

#----- begin Japanese support package (2002-apr-01)
cidToUnicode Adobe-Japan1 /usr/share/xpdf/japanese/Adobe-Japan1.cidToUnicode
unicodeMap ISO-2022-JP /usr/share/xpdf/japanese/ISO-2022-JP.unicodeMap
unicodeMap EUC-JP /usr/share/xpdf/japanese/EUC-JP.unicodeMap
unicodeMap Shift-JIS /usr/share/xpdf/japanese/Shift-JIS.unicodeMap
cMapDir Adobe-Japan1 /usr/share/xpdf/japanese/CMap
toUnicodeDir /usr/share/xpdf/japanese/CMap
displayCIDFontX Adobe-Japan1 "-*-fixed-medium-r-normal-*-%s-*-*-*-*-*-jisx0208.1983-0" ISO-2022-JP
#----- end Japanese support package

#----- begin Korean support package (2002-apr-01)
cidToUnicode Adobe-Korea1 /usr/share/xpdf/korean/Adobe-Korea1.cidToUnicode
unicodeMap ISO-2022-KR /usr/share/xpdf/korean/ISO-2022-KR.unicodeMap
cMapDir Adobe-Korea1 /usr/share/xpdf/korean/CMap
toUnicodeDir /usr/share/xpdf/korean/CMap
displayCIDFontX Adobe-Korea1 "-*-mincho-medium-r-normal-*-%s-*-*-*-*-*-ksc5601.1987-0" ISO-2022-KR
#----- end Korean support package

#----- begin Latin2 support package (2002-jun-03)
unicodeMap Latin2 /usr/share/xpdf/latin2/Latin2.unicodeMap
#----- end Latin2 support package

#----- begin Thai support package (2002-jan-16)
nameToUnicode /usr/share/xpdf/thai/Thai.nameToUnicode
unicodeMap TIS-620 /usr/share/xpdf/thai/TIS-620.unicodeMap
#----- end Thai support package

#----- begin Turkish support package (2002-apr-10)
unicodeMap ISO-8859-9 /usr/share/xpdf/turkish/ISO-8859-9.unicodeMap
#----- end Turkish support package

Ich hoffe du weißt einen Rat und kannst mir helfen :(

Lg
wanted
 
Hm, wo soll man anfangen? :s
Erstmal, alles was bash-Funktionalität ist und (afair) in sh nicht funktionieren wird:
1. $( ... ) Konstrukte, nutze statt $( ... ) einfach backticks. (Sind ja eh wild durcheinandergewürfelt im Skript)
2. Funktionen (bin ich mir aber nicht sicher)
3. Arrays
4. [[ .. ]] Konstrukte (man nehme einfach [ .. ])

Was die Syntaxfehler angeht, oha.
Erstmal: bei der Arrayzuweisung (FAK array) fehlt eine schließende Klammer (beim drüberlesen gesehen).

/etc/xpdfrc=/etc/xpdfrc: No such file or directory
Du hast keine offensichtlich nicht den Anflug einer Ahnung wie man Variablen Werte zuweist. (Was bei den Parameter-Variablen ohnehin völlig absurd und unnötig ist. Die Variablen sind schon gesetzt.)
Lies das hier.
$2 enthält den String "prim.txt". Wenn du darauf zugreifen willst machst du $2 und nicht $prim.txt. $prim.txt wäre nämlich die Variable $prim mit .txt suffix.
Also ich habe zunächst einmal einfach deine Datei kopiert und FILE1 usw. mit meinen Daten ersetzt. Wenn ich nun das Script aufrufe mit: ./script /etc/xpdfrc prim.txt dann kommen diese Fehlermeldungen:
Ja aua. FILE und FILE2 sind (gültige) Variablennamen. Auf Variablen zugreifen geht mittels dollar-Symbol, also $FILE wird von der bash durch den Inhalt der Variable FILE substituiert.

Die Meldungen hier:
/etc/xpdfrc: cidToUnicode: not found
/etc/xpdfrc: unicodeMap: not found
/etc/xpdfrc: unicodeMap: not found
/etc/xpdfrc: unicodeMap: not found
/etc/xpdfrc: cMapDir: not found
/etc/xpdfrc: toUnicodeDir: not found
/etc/xpdfrc: displayCIDFontX: not found
/etc/xpdfrc: cidToUnicode: not found
/etc/xpdfrc: unicodeMap: not found
/etc/xpdfrc: unicodeMap: not found
sehen stark danach aus, als ob das Skript versucht die Datei /etc/xpdfrc wiederum als Skript aufzurufen. Weiß aber nicht genau wo das jetzt passiert.

Lies dir das hier generell mal durch. Also zumindest die für dich relevanten Teile. Vieles gilt auch für bourne shell. So völlig ohne Ahnung von Syntax einer Sprache ist halt nix mit Programmieren.

Mein Tip: schreib das Skript noch mal "from scratch". Teil für Teil. Das Primzahl-Problem wurde ja hier schon für dich gelöst. Das Schreiben des Skripts kannst du dann ja selber machen.
Dann kannst du zumindest an eigenen Fehlern rumdoktorn. Ein Skript mit Zeilen wie
Code:
`foo_function`
if [ $? -eq 0 ]; then
zu debuggen ist imho für einen Einsteiger eher Kontraproduktiv, weil ein Einsteiger ja erstmal davon ausgehen wird, dass der geschriebene Code irgendwo Sinn macht, was er an dieser Stelle zum Beispiel absolut nicht tut. (Von Redundanz nicht zu sprechen.)

Noch ganz interessante Lektüre:
Code:
man test
'[ ... ]' ist nämlich eigentlich nur ne andere Schreibweise für 'test ...'. Naja, hf.
 

Ähnliche Themen

Brauche hilfe bei einen Shell Script "-eq Parameter"

problem mit rsync shell-script

KDE-compiz-gcompizthemer-Autostart-HowTo

Zurück
Oben