ubuntuusers.de

[Bash] – Grundsätzliches Verständnisproblem

Status: Gelöst | Ubuntu-Version: Ubuntu 22.04 (Jammy Jellyfish)
Antworten |

Acamat

Avatar von Acamat

Anmeldungsdatum:
23. September 2011

Beiträge: 114

Wohnort: Essen

Guten Tag,

ich habe offensichtlich ein grundlegendes Verständnisproblem mit der Bash-Programmierung. Wenn ich manuell

1
2
3
$ FRM="+%Y-%m-%d %H:%M (%W-%a)"
$ RGX="20.+Cr"
$ ls -lA --block-size=k --color=auto --group-directories-first --time-style="$FRM" | grep "$RGX"

eingebe, erscheint

1
2
3
4
5
6
-rwxr--r-- 1 acamat acamat  1K 2023-10-28 07:57 (43-Sa) Create
-rwxr--r-- 1 acamat acamat  1K 2023-05-12 08:52 (19-Fr) CreateBackup
-rwxr--r-- 1 acamat acamat  1K 2023-10-29 09:28 (43-So) CreateDocument
-rwxr--r-- 1 acamat acamat  1K 2023-10-28 07:54 (43-Sa) CreateOds
-rwxr--r-- 1 acamat acamat  2K 2023-10-29 09:28 (43-So) CreateScript
-rwxr--r-- 1 acamat acamat  1K 2022-12-18 21:22 (50-So) CreateTxt

Schreibe ich das jedoch in ein Skript

1
2
3
4
5
$ cat Problem
#!/bin/bash
FRM="+%Y-%m-%d %H:%M (%W-%a)"
RGX="20.+Cr"
ls -lA --block-size=k --color=auto --group-directories-first --time-style="$FRM" | grep "$RGX"

schreibe und ausführe

1
$ Problem

erhalte ich keine Ausgabe. Was mache ich falsch und wie geht es richtig?

shiro Team-Icon

Supporter

Anmeldungsdatum:
20. Juli 2020

Beiträge: 1270

$ RGX="20.+Cr"

Das "+" bedeutet eine "extended regular expression". Beim einfachen "grep" Aufruf wird allerdings nur die "basic regular expressions" angewendet. Du solltest daher bei deinem Aufruf

grep -E "$RGX"

verwenden. Oder in "basic" abfragen

$ RGX="20.* Cr"
... | grep "$RGX"

kB Team-Icon

Supporter, Wikiteam
Avatar von kB

Anmeldungsdatum:
4. Oktober 2007

Beiträge: 9706

Wohnort: Münster

Acamat schrieb:

[…] grundlegendes Verständnisproblem

Eine Datei wird nur unter besonderen Voraussetzungen ausgeführt:

  1. Sie muss durch den Bediener ausführbar sein. → Rechte

  2. Und sie muss

    • entweder über PATH auffindbar sein

    • oder mit ihrem Pfad angegeben werden. Dabei kann man

      • entweder den absoluten Pfad angeben

      • oder den relativen Pfad vom aktuellen Arbeitsverzeichnis aus.

Wenn die auszuführende Datei nicht im Pfad, aber im aktuellen Arbeitsverzeichnis liegt, muss man also schreiben: Entweder $PWD/Problem oder ./Problem

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17620

Wohnort: Berlin

kB schrieb:

Wenn die auszuführende Datei nicht im Pfad, aber im aktuellen Arbeitsverzeichnis liegt, muss man also schreiben: Entweder $PWD/Problem oder ./Problem

... oder das Verzeichnis, in dem die Datei ist, in den $PATH aufnehmen (da bietet sich es sich an, ein Verzeichnis $HOME/bin anzulegen, wenn man voraussichtlich mehrere eigene Scripte schreiben wird, die man häufiger nutzt, und die eigenen Scripte und evtl. Binaries da zu sammeln).

... oder, bei seltener Verwendung, explizit den Interpreter aufrufen und das Programm als Parameter übergeben (bash Problem).

trollsportverein

Avatar von trollsportverein

Anmeldungsdatum:
21. Oktober 2010

Beiträge: 4967

Sieht ja irgendwie nach einer persönlichen "ls" Spielart aus, für die man üblicherweise in der $HOME/.bashrc sein alias hat. Dann braucht es auch kein extra Script und um $PATH muss man sich auch keine Gedanken machen.

Acamat

(Themenstarter)
Avatar von Acamat

Anmeldungsdatum:
23. September 2011

Beiträge: 114

Wohnort: Essen

shiro schrieb:

grep -E "$RGX"

Ich danke Dir! Denn

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
$ cat Problem
#!/bin/bash
FRM="+%Y-%m-%d %H:%M (%W-%a)"
RGX="20.+Cr"
ls -lA --block-size=k --color=auto --group-directories-first --time-style="$FRM" | grep [mark]-E[/mark] "$RGX"

$ Problem
-rwxr--r-- 1 acamat acamat  1K 2023-10-28 07:57 (43-Sa) Create
-rwxr--r-- 1 acamat acamat  1K 2023-05-12 08:52 (19-Fr) CreateBackup
-rwxr--r-- 1 acamat acamat  1K 2023-10-29 09:28 (43-So) CreateDocument
-rwxr--r-- 1 acamat acamat  1K 2023-10-28 07:54 (43-Sa) CreateOds
-rwxr--r-- 1 acamat acamat  2K 2023-10-29 09:28 (43-So) CreateScript
-rwxr--r-- 1 acamat acamat  1K 2022-12-18 21:22 (50-So) CreateTxt

ist die Lösung ☺!. Denn ich hatte

1
2
$ cat .bash_aliases | grep "grep="
alias grep='egrep'

völlig vergessen.

Acamat

(Themenstarter)
Avatar von Acamat

Anmeldungsdatum:
23. September 2011

Beiträge: 114

Wohnort: Essen

trollsportverein schrieb:

üblicherweise in der $HOME/.bashrc sein alias…

Damit hast Du vollkommen recht! .bash_aliases ist der rechte Ort, um einen Befehl wie beispielsweise

alias rm='rm -i'

fest zu ersetzen, aber mir ist keine Möglichkeit bekannt, wie ich dort nach den Befehlsparametern unterscheiden könnte.

trollsportverein

Avatar von trollsportverein

Anmeldungsdatum:
21. Oktober 2010

Beiträge: 4967

Dafür gibt es dann die Möglichkeit function für die Bash zu definieren. Ebenfalls in der $HOME/.bashrc.

Hier mal ein Beispiel, das lässt GCC Compiler Versionen auswählen und ihre Priorität:

setgcc () 
{ 
    echo "Set gcc compiler Version, first number Compiler version, second number priority." && \
    sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-"$1" "$2" --slave /usr/bin/g++ g++ /usr/bin/g++-"$1" --slave /usr/bin/gcov gcov /usr/bin/gcov-"$1" && \ 
    echo "Done." || echo "No change."
}

wxpte

Anmeldungsdatum:
20. Januar 2007

Beiträge: 1388

Acamat schrieb:

Damit hast Du vollkommen recht! .bash_aliases ist der rechte Ort, um einen Befehl wie beispielsweise

alias rm='rm -i'

fest zu ersetzen, aber mir ist keine Möglichkeit bekannt, wie ich dort nach den Befehlsparametern unterscheiden könnte.

Die im Eröffnungspost beschriebene Aufgabe ist doch im Grunde auch nicht viel anders, als dein hier zitiertes Beispiel: die beiden Variablen hast du mit festen Strings bestückt, also brauchst du sie eigentlich gar nicht wirklich. Für den Alias kannst du einen beliebigen Namen definieren, ich nenne ihn hier einmal indls (Kürzel für individuelles ls):

alias indls='ls -lA --block-size=k --color=auto --group-directories-first --time-style="+%Y-%m-%d %H:%M (%W-%a)" | grep -E "20.+Cr"'

Schon hast du einen passenden Alias für deinen Befehl.

Als function, wie trollsportverein es vorgeschlagen hat, kann man es natürlich auch machen; aber in diesem Fall ist das mMn gar nicht nötig.

Acamat

(Themenstarter)
Avatar von Acamat

Anmeldungsdatum:
23. September 2011

Beiträge: 114

Wohnort: Essen

wxpte schrieb:

Die im Eröffnungspost beschriebene Aufgabe ist doch im Grunde auch nicht viel anders, als dein hier zitiertes Beispiel…

Dieses Beispiel ist aber nur ein Teil eines umfangreicheren Skripts. Das Problem ist nun gelöst; belassen wir es einfach dabei.

Ich danke Euch allen für Eure Hilfe und Unterstützung.

Antworten |