staging.inyokaproject.org

Suchparameter mit cat

Status: Ungelöst | Ubuntu-Version: Ubuntu 18.04 (Bionic Beaver)
Antworten |

Mondviech

(Themenstarter)
Avatar von Mondviech

Anmeldungsdatum:
25. Juli 2015

Beiträge: 48

rafi schrieb:

ist doch ok dass das zwei Befehle sind,

Der erste geht kürzer mit

1
mv ~/*.c /home/mondi/Dokumente/backupC2

An welcher FH lernt man den Bash?

Hallo danke für deinen Tipp.

Ich studiere nicht ich beschäftige mich nur privat mit Informatik.

Das Buch was ich lese heißt:

Informatik: Eine praktische Einführung mit Bash und Python (De Gruyter Studium) von Tobias Häberlein (Autor)

Er ist Professor an der Hochschule Albstadt-Sigmaringen.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

Marc_BlackJack_Rintsch schrieb:

@rafi: Das ist nicht äquivalent. Dein mv kopiert

Vor allem kopiert mv nicht sondern verschiebt (auch wenn er dafür eine Kopie in einem anderen Dateisystem anlegen muss).

nur die Dateien (und Verzeichnisse!), welche direkt im Heimatverzeichnis liegen, das find sucht nur Dateien und keine Verzeichnisse, dafür aber auch in allen Unterverzeichnissen. Kommt halt darauf an was der OP eigentlich will/soll. ☺

Wie so oft stellt man fest, dass erst die Anforderungen klar sein müssen, bevor man eine Lösung finden kann...

Mondviech

(Themenstarter)
Avatar von Mondviech

Anmeldungsdatum:
25. Juli 2015

Beiträge: 48

Ist mir auch aufgefallen, mit mv verschiebt man cp wäre die richtige Befehl gewesen.

Ich habe noch eine Frage:

Geben Sie ein Unix-Kommando an, das den String Tobias ist da! ausgibt, falls der Benutzer tobias am System angemeldet ist, und den String Tobias ist nicht da., falls der Benutzer tobias nicht angemeldet ist. Achten Sie darauf, dass ausschließlich die angegebenen Strings ausgegeben werden, insbesondere keine Fehlermeldungen.

Ich glaube ich komme dem Schritt langsam näher:

1
2
mondi@mondi-MS-7996:~$ who | grep "mondi"
mondi    :1           2018-05-05 15:14 (:1)

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4735

@Mondviech: Das würde auch Benutzer auflisten die angemeldet sind und mondi als Teilzeichenkette enthalten und angemeldet sind, auch wenn mondi selbst nicht angemeldet ist. Ich würde das strikter angehen und erst einmal die erste Spalte von der who-Ausgabe, zum Beispiel mit cut isolieren, und dann grep nach exakt dem Namen suchen lassen und nicht nur irgendwo im Namen.

Mondviech

(Themenstarter)
Avatar von Mondviech

Anmeldungsdatum:
25. Juli 2015

Beiträge: 48

Wie schaut es aus mit Schleifen und booleschen Werten. Also so eine Codes wie:

1
2
3
4
if [ "$(whoami)" = "mondi" ]; then
        echo "Mondi ist online"
        else echo "Mondi ist nicht online"
fi
1
2
3
4
if [ "$(whoami)" = "mondi2" ]; then
        echo "Mondi ist online"
        else echo "Mondi ist nicht online"
fi

Habs mit dem Bashskript hinbekommen, gibt es vielleicht eine Möglichkeit das auch ohne ein Script zu machen einfach mit einem Befehl im Terminal?

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4735

@Mondviech: In dem Quelltext ist keine Schleife enthalten und einen boole'schen Wert gibt es da auch nicht wirklich. Das false ist eine Zeichenkette und die ist in diesem Kontext ”wahr”, was zu der verwirrenden Ausgabe von True führt. 😕

Hinter dem if muss etwas stehen was ausgeführt wird und dessen Rückgabecode dann verwendet wird um zu entscheiden welcher Zweig (then/else) ausgeführt wird. Bei einem Rückgabecode von 0 wird der then-Zweig ausgeführt, ansonsten der else-Zweig.

Bei Pipes ist der Rückgabewert der des letzten Programms. Du willst also als letztes in der Kette von Pipes ein Programm haben das 0 als Rückgabewert hat, wenn der Benutzer angemeldet ist, und einen anderen Rückgabewert wenn der Benutzer nicht angemeldet ist. Schau Dir einfach mal die Dokumentation von grep an, was das unter welchen Umständen als Rückgabewert hat (englisch „exit status“). Auch in Verbindung mit bestimmten Optionen, die Du für Deine Aufgabe sinnvoll nutzen kannst.


Edit: Jetzt hast Du den Beitrag geändert während ich die Antwort geschrieben habe. ☺

whoami ist nicht die Lösung zu der Ausgabe, denn das gibt ja nur den Namen des aktuellen Benutzers aus, der dieses Programm aufruft. Das muss ja nicht tobias sein, der könnte aber trotzdem angemeldet sein.

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4735

@Mondviech: Mit einem Befehl wird das nicht gehen, aber Du kannst das was Du im Skript geschrieben hast, ja auch einfach im Terminal eingeben. Vielleicht mit weniger Zeilenumbrüchen und mehr Semikolons, damit es ein Einzeiler wird.

Mein Ansatz wäre:

1
printf 'Tobias ist '; who | grep -q '^tobias[[:space:]]' && echo 'da!' || echo 'nicht da.'

Wobei diese Kombination aus && und || ein paar Fallstricke bereit hält, die in diesem Beispiel nicht zum tragen kommen. Wenn man sich da keine Gedanken drum machen möchte, kann man das natürlich auch ganz klassisch mit if/then/else ausdrücken:

1
printf 'Tobias ist '; if who | grep -q '^tobias[[:space:]]'; then echo 'da!'; else echo 'nicht da.'; fi

Mondviech

(Themenstarter)
Avatar von Mondviech

Anmeldungsdatum:
25. Juli 2015

Beiträge: 48

Danke für deine Antwort!

Ich habe noch eine Frage. Wie kann ich alle angemeldeten Benutzer aufzulisten, deren Benutzername mit a endet?

Außerdem wie kann ich mit egrep nach Dateien in einem Verzeichnis suchen, in denen ich lese oder Schreibrechte habe, aber nicht beides? Wie kann ich alle Dateien auflisten (mit egrep) wo ausschließlich ich Schreibrechte habe?

Antworten |