ubuntuusers.de

Hilfe bei einfachem Shell Script

Status: Ungelöst | Ubuntu-Version: Ubuntu 15.10 (Wily Werewolf)
Antworten |

noob.sh

(Themenstarter)

Anmeldungsdatum:
1. Mai 2016

Beiträge: Zähle...

habe die datei jetzt mit dem nano editor erstellt es funktioniert nun!

nun aber zur eigentlichen aufgabe aus meinem ersten post: ich habe bis jetzt:

1
2
3
4
5
6
7
8
#!/bin/bash
cd $1
echo Die Dateien des ordner scripts der Größe nach sortiert sind:
sleep 5
ls -S
echo Die Dateien sortiert nach letzter modifizierung:
sleep 5
ls -t

was noch fehlt ist das beim aufruf eben der pfad des verzeichnisses und eine zeichenkette übergeben werden soll wie mache ich das mit der parameterübergabe?

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Hi noob.sh,

zuerst mal herzlich willkommen hier auf dem Forum !

noob.sh schrieb:

danke ja mache ich beim nächsten mal habe jetzt gecheckt wie die codeblocks funktionieren sry^^ danke für deine mühe!

Das ist gut. Ohne Codeblock sind Befehlszeilen hier nämlich unlesbar.

also ich habe einfach enter benutzt als Zeilenumbruch das scheint falsch zu sein wie geht es dann unter linux ich habe keine ahnung?

Die Frage ist hier nicht: Linux oder sonstwas, sondern: womit hast Du Dein Skript geschrieben ? - offenbar nämlich mit einem Win...-Editor,
und der fügt am Ende jeder Zeile noch ein "\r" ein. Das meldet ja auch die Fehlermeldung:

bash: ./s.sh: /bin/bash^M: Defekter Interpreter: Datei oder Verzeichnis nicht gefunden

Das musst Du auf jeden Fall reparieren, denn das "\r" ist für *nix ein normales Zeichen, das jetzt am Ende von jeder Zeile steht !
Damit ist natürlich jedes letzte Wort in der Zeile kaputt, bist Du es repariert hast.

So, - und wie Du das machen kannst, das haben meine Vorredner ja schon erklärt.

Edit:

was noch fehlt ist das beim aufruf eben der pfad des verzeichnisses und eine zeichenkette übergeben werden soll wie mache ich das mit der parameterübergabe?

Da guckst Du mal bitte in unserem Skripting-Wiki nach, da ist das schön beschrieben.

LG,

track

ChickenLipsRfun2eat Team-Icon

Anmeldungsdatum:
6. Dezember 2009

Beiträge: 12067

Ganz vereinfacht dargestellt kannst du $1 und $2 abfragen.

1
2
3
4
5
6
7
#!/bin/bash
echo "$1"
echo "***"
echo "$2"

#Aufruf
./scriptname /Pfad1/bla Option1

Mehr dazu unter Shell/Bash-Skripting-Guide für Anfänger

/edit: Track war mit seinem edit schneller. Hör auf ihn (tu ich auch immer ☺ )

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7790

noob.sh schrieb:

cd $1

Wenn du Variablen benutzt, müssen die praktisch immer in "" sonst gibts Ärger mit Leerzeichen usw.

noob.sh

(Themenstarter)

Anmeldungsdatum:
1. Mai 2016

Beiträge: 11

danke ja das mit der Parameterübergabe habe ich einigermassen verstanden. weiss denn einer wie ich mit ls nur die 5 größten dateien ausgegeben werden also wenn mehr als 5 im ordner enthalten sind? und wie kann ich die 5 dateien die zuletzt modifiziert wurden ausgeben die mit einer zeichenkette beginnen die ich als zweiten parameter übergeben habe

ich weiss das ich mit dem Befehl grep dateien nach einem suchwort durchsuchen kann und mit ls -t die zuletzt modifizierten dateien ausgeben kann jetzt will ich das kombinieren das unter den dateien die mit einer bestimmten Zeichenkette beginnen (die als parameter übergeben wird) die fünf zuletzt modifizierten dateien ausgegeben werden (siehe erster post unter 2.)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
{{{#!code bash
#!/bin/bash
cd "$1"
echo Die Dateien des ordner scripts der Größe nach sortiert sind:
sleep 5
ls -S
echo Die Dateien sortiert nach letzter modifizierung:
sleep 5
grep -n "$2"
ls -t

stimmt so aber nicht, wie gehts richtig?

sebix Team-Icon

Ehemalige

Anmeldungsdatum:
14. April 2009

Beiträge: 5584

noob.sh schrieb:

weiss denn einer wie ich mit ls nur die 5 größten dateien ausgegeben werden also wenn mehr als 5 im ordner enthalten sind? und wie kann ich die 5 dateien die zuletzt modifiziert wurden ausgeben die mit einer zeichenkette beginnen die ich als zweiten parameter übergeben habe

Manpage lesen. Mit -1 wird jeder Eintrag eine Zeile. Dann kannst du mit ls -S1 | head -n 5 die ersten 5 herausfiltern.

Zitat aus der Manpage:

  • c with -lt: sort by, and show, ctime (time of last modification of file status information); with -l: show ctime and sort by name; otherwise: sort by ctime, newest

first

jetzt will ich das kombinieren das unter den dateien die mit einer bestimmten Zeichenkette beginnen (die als parameter übergeben wird) die fünf zuletzt modifizierten dateien ausgegeben werden (siehe erster post unter 2.)

Einfach so: ls $1* | ...

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7790

So langsam aber sicher sind wir hier bei Hausaufgaben? 😉

Einfach so: ls $1* | ...

Auch hier... Variablen brauchen Gänsefüsschen ls "$1"*

Man sollte bei der Gelegenheit auch anmerken, daß ls in Verbindung mit | fast immer falsch ist. Solange du damit nur was ausgeben willst ist es vielleicht okay. Für alles andere (tatsächlich mit den Dateien arbeiten) lieber nicht mit ls machen.

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Ja genau: ls zu parsen ist immer Mist !

Was Du suchst ist find .... print0 - dann bekommst Du eine Null-terminierte Liste (und die ist wasserdicht !).
Wenn Dir das zu windig ist, kannst Du Dir notfalls mit stat selber was zusammen basteln. Aber denk dran: immer als Null-terminierte Strings !
Wenn Du willst, kannst Du die auch mit sort -z sortieren. Geht alles !

LG,

track

Antworten |