Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
-
guennid
Beitrag
von guennid » 13.01.2019 18:37:51
Code: Alles auswählen
test=find /usr/share/applications -maxdepth 1 -type f | wc -l
Wie kriege ich das Ergebnis in eine Variable?
Grüße, Günther
Zuletzt geändert von guennid am 15.01.2019 10:03:05, insgesamt 3-mal geändert.
-
cronoik
- Beiträge: 2049
- Registriert: 18.03.2012 21:13:42
- Lizenz eigener Beiträge: GNU Free Documentation License
Beitrag
von cronoik » 13.01.2019 18:50:24
Code: Alles auswählen
test=$(find /usr/share/applications -maxdepth 1 -type f | wc -l)
Hilf mit unser
Wiki zu verbessern!
-
MartinV
- Beiträge: 790
- Registriert: 31.07.2015 19:38:52
- Wohnort: Hyperion
-
Kontaktdaten:
Beitrag
von MartinV » 13.01.2019 18:51:34
Code: Alles auswählen
zahl=$(find /usr/share/applications -maxdepth 1 -type f | wc -l)
Oder:
Code: Alles auswählen
zahl="$(find /usr/share/applications -maxdepth 1 -type f | wc -l)"
Besser "zahl" als "test", weil test auch ein Befehl ist.
Die Vernunft kann einem schon leidtun. Sie verliert eigentlich immer.
-
guennid
Beitrag
von guennid » 13.01.2019 18:54:32
Entschuldigt bitte die blödsinnige Schreibweise in meinem Code-Schnipsel. Das war nicht der Ausdruck, den ich
in die Variable stecken wollte, sondern der 1. (untaugliche) Versuch Selbiges zu tun. Martins Hinweis, die Verwendung von "test" betreffend, ist registriert.
-
guennid
Beitrag
von guennid » 13.01.2019 21:33:04
Doch noch nicht gelöst:
Wie kriege ich den Wert der Linux-Variablen, hier "zahl" in eine Pascal-Variable oder funktioniert das nur über die Anlage einer Datei?
Grüße, Günther
-
MSfree
- Beiträge: 11604
- Registriert: 25.09.2007 19:59:30
Beitrag
von MSfree » 13.01.2019 21:53:58
guennid hat geschrieben: 13.01.2019 21:33:04
Wie kriege ich den Wert der Linux-Variablen, hier "zahl" in eine Pascal-Variable
Oha, meine Pascalzeiten sind schon eine Ewigkeit her
Direkt bekommt man solche Werte auf zwei Arten in ein Programm. Entweder über Kommandozeilenparameter, die relevante Funktion dürfte
ParamStr sein. Oder in Form einer Umgebungsvariable mit
GetEnv.
Der Wert ist allerdings immer ein String und kein Integer, muß also noch umgewandelt werden.
-
guennid
Beitrag
von guennid » 13.01.2019 23:37:57
Das kriege ich in Bezug auf mein Shell-Kommando nicht gebacken. Ich werds wohl über eine Datei machen.
Grüße, Günther
-
MSfree
- Beiträge: 11604
- Registriert: 25.09.2007 19:59:30
Beitrag
von MSfree » 14.01.2019 08:02:37
guennid hat geschrieben: 13.01.2019 23:37:57
Das kriege ich in Bezug auf mein Shell-Kommando nicht gebacken.
Das ist doch eigentlich ganz einfach:
Eine Umgebungsvariable hast du doch sowieso schon:
Code: Alles auswählen
test=`find /usr/share/applications -maxdepth 1 -type f | wc -l`
"test" ist hier deine Umgebungsvariable. Um diese für andere Programme sichtbar zu machen, mußt du sie nur exportieren:
Und dann rufst du dein Pascalprogram auf, zusammen also so
Code: Alles auswählen
#!/bin/bash
test=`find /usr/share/applications -maxdepth 1 -type f | wc -l`
export test
MeinPascalProgram
Dein Pascalprogramm könnte dann so aussehen:
Code: Alles auswählen
Program MeinPascalProgram;
uses Dos;
begin
var
str : string;
numFiles: integer;
str := GetEnv('test'));
numFiles = StrToInt(str);
WriteLn('test ist ',str);
WriteLn('numFiles ist ',numFiles);
end.
-
Phineas
- Beiträge: 354
- Registriert: 20.06.2012 20:26:19
Beitrag
von Phineas » 14.01.2019 14:45:03
Ich werde wohl nie verstehen, warum man sich hier, wie in vielen ähnlichen Fällen, mit einer 99%-Lösung zufrieden gibt. Dass es wohl kaum Jemanden gibt, der seine Dateinamen mit Newlines versieht, ist kein wirkliches Argument: Das Ding ist nun mal erlaubt - und nur das zählt (so wie wc -l Newlines zählt - und eben keine Dateien).
-
tobo
- Beiträge: 2336
- Registriert: 10.12.2008 10:51:41
Beitrag
von tobo » 14.01.2019 15:51:41
Ja, innerhalb von find ist alles geregelt und sicher, auch über -exec. Aber sobald man aus find rauspiped und die Daten einem anderen Programm übergibt, muss man aufpassen (z.B. wegen newlines). Wenn nur die Anzahl interessiert:
Code: Alles auswählen
find /usr/share/applications -maxdepth 1 -type f -printf "\n" | wc -l
-
guennid
Beitrag
von guennid » 14.01.2019 20:42:11
Hallo MSfree
Funktioniert.
Freepascal will allerdings die Funktion fpGetEnv (Unit baseUnix) statt GetEnv haben.
Ohne den Umweg über's shell-script wär's mir lieber gewesen, habe ich aber nicht hingekriegt.
Danke sehr!
-
MSfree
- Beiträge: 11604
- Registriert: 25.09.2007 19:59:30
Beitrag
von MSfree » 14.01.2019 21:00:40
guennid hat geschrieben: 14.01.2019 20:42:11
Ohne den Umweg über's shell-script wär's mir lieber gewesen, habe ich aber nicht hingekriegt.
Eine Dateiliste kannst du dir auch mit Pascal erstellen. Ich habe das hier gefunden:
http://wiki.freepascal.org/FindAllFiles
Oder auch mit
FindFirst,
FindNext, wenn du es selbst zusammenklöppeln möchtest. Eigentlich ist das alles kein Hexenwerk.
-
tobo
- Beiträge: 2336
- Registriert: 10.12.2008 10:51:41
Beitrag
von tobo » 14.01.2019 21:01:15
guennid hat geschrieben: 14.01.2019 20:42:11
Ohne den Umweg über's shell-script wär's mir lieber gewesen, habe ich aber nicht hingekriegt.
Sowas?
Code: Alles auswählen
program RunShellCommand;
uses Process;
var s: AnsiString;
begin
if RunCommand('/bin/sh', ['-c', 'find /usr/share/applications -maxdepth 1 -type f -printf "\n" | wc -l'], s) then
WriteLn(s);
end.
-
guennid
Beitrag
von guennid » 14.01.2019 22:05:28
Von Objektorientierung habe ich keine Ahnung und ich will die auch nicht mehr kriegen.
Unkommentierte Shell-Syntax ist mir ein Greuel.
Ich bevorzuge Variablen- Funktions- und Prozedurnamen soweit möglich in Deutsch zu formulieren.
Ich mach' hier was für den Hausgebrauch.
Oder auch mit FindFirst, FindNext
Das kenn' ich. Hielt ich aber, ohne es überprüft zu haben, für DOS-Spezialitäten.