Script für eine Bash Ausgabe

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
alboran
Beiträge: 96
Registriert: 15.09.2009 14:24:48

Script für eine Bash Ausgabe

Beitrag von alboran » 07.11.2020 19:25:51

Hallo zusammen,
ich bin im Scripting noch relativ unbeleckt und würde gerne für folgende Bash Eingabe ein Script anlegen.

Code: Alles auswählen

echo -e "\n${TR} \n$(date +'%a. %d %b. A.D. %Y') ${xxx} \n\nxxx" >> datei/liste.txt
Das ganze soll dazu dienen das ich in Zeiten von Corona mir über die Konsole schnell mal die Orte und Begegnungen eintragen kann.
Ich habe mir verschiedene Variablen zusammengebastelt die wiederkehrende Ereignisse ausgeben. Diese würde ich gerne über eine Eingabeaufforderung nach dem Datum eingeben ${xxx} können, gefolgt von "Möchten sie noch weitere eingaben machen?"
wo ich dann händisch noch eventuell etwas hinzufügen kann.
Ich hoffe diesmal ist es besser verständlich :wink:

LG alboran
Zuletzt geändert von alboran am 08.11.2020 11:58:52, insgesamt 1-mal geändert.
ThinkPad T540p mit ArchLinux DebianFluxbox

tobo
Beiträge: 2349
Registriert: 10.12.2008 10:51:41

Re: Script für eine Bash Ausgabe

Beitrag von tobo » 07.11.2020 22:10:58

alboran hat geschrieben: ↑ zum Beitrag ↑
07.11.2020 19:25:51
[...] und würde gerne für folgende Bash Eingabe ein Script anlegen.

Code: Alles auswählen

echo -e "\n${TR} \n$(date +'%a. %d %b. A.D. %Y') ${xxx} \n\nxxx" >> datei/liste.txt
Mit Bash-Eingabe meinst du einen variablen Anteil (TR, xxx?), den du im Skript einlesen willst? Du erzeugst/hängst an eine liste.txt an - davon dann also wohl mehrere, mit speziellem Datum, das entweder besonders christlich ist oder aber auch unter 1 rutschen kann?
Am liebsten wenn ich bei

Code: Alles auswählen

${xxx} und \n\nxxx
noch über 'read -p' eine Eingabeaufforderung bekäme. :wink:
Ich habe mir für '${xxx}' schon verschiedenen Variablen angelegt.... oder sollte ich besser Array's benutzen?
Gute Frage, um wieviele x dreht es siich denn?

Sofern sich niemand mehr meldet, der deine Anfrage durchschaut hat, solltest du das vielleciht nochmal komplett neu erklären. Und zwar so, dass das jemand versteht, der nicht deine Problemstellung im Kopf hat...

Benutzeravatar
alboran
Beiträge: 96
Registriert: 15.09.2009 14:24:48

Re: Script für eine Bash Ausgabe

Beitrag von alboran » 07.11.2020 22:34:26

@tobo
bis incl.

Code: Alles auswählen

echo -e "\n${TR} \n$(date +'%a. %d %b. A.D. %Y')
soll es so bleiben, das mit christlich finde ich süß, war nur so ein Einfall von mir. :lol:
Die menge der xxx bedeutet nicht die Anzahl sondern nur das ich dort etwas eingeben möchte.
Letztendlich geht es mir darum, das ich, wenn ein Script diese Eingabemaske öffnet, weitere Eingaben machen kann.
Mit Bash-Eingabe meinst du einen variablen Anteil (TR, xxx?),
TR ist schon eine Variable.
der nicht deine Problemstellung im Kopf hat...
anscheinend konntest Du mir folgen :wink:
LG
ThinkPad T540p mit ArchLinux DebianFluxbox

tobo
Beiträge: 2349
Registriert: 10.12.2008 10:51:41

Re: Script für eine Bash Ausgabe

Beitrag von tobo » 07.11.2020 23:34:31

alboran hat geschrieben: ↑ zum Beitrag ↑
07.11.2020 22:34:26
anscheinend konntest Du mir folgen :wink:
Glaube ich mal nicht!?
Mit Eingabemaske meinst du da den Text von "read -p"; wieviele sind weitere Eingaben und meint das in derselben oder in mehreren Abfragen? Das geht alles nicht aus deinen Aussagen hervor!? Ich für meinen Teil kann dir so nicht weiterhelfen...

Mal andersrum gefragt - Was ist denn an diesem Ansatz falsch:

Code: Alles auswählen

TR=42; read -p "$(printf "\n${TR} \n$(date "+%a. %d %b. A.D. %Y") ")" x; printf "\n${TR} \n$(date "+%a. %d %b. A.D. %Y") ${x}\n\n${x}\n"

Benutzeravatar
alboran
Beiträge: 96
Registriert: 15.09.2009 14:24:48

Re: Script für eine Bash Ausgabe

Beitrag von alboran » 08.11.2020 00:00:50

tobo hat geschrieben: ↑ zum Beitrag ↑
07.11.2020 23:34:31


Mal andersrum gefragt - Was ist denn an diesem Ansatz falsch:

Code: Alles auswählen

TR=42; read -p "$(printf "\n${TR} \n$(date "+%a. %d %b. A.D. %Y") ")" x; printf "\n${TR} \n$(date "+%a. %d %b. A.D. %Y") ${x}\n\n${x}\n"
Er gibt das aus

Code: Alles auswählen

42 
Sa. 07 Nov. A.D. 2020 
42 
Sa. 07 Nov. A.D. 2020 
Ich denke ich werde das was ich gerne möchte nochmal neu definieren, damit es allgemein verständlich ist.

Abgesehen davon ist 'TR' schon eine von mir definierte Variable. Warum definierst du sie neu?

LG
Zuletzt geändert von alboran am 08.11.2020 00:30:19, insgesamt 1-mal geändert.
ThinkPad T540p mit ArchLinux DebianFluxbox

tobo
Beiträge: 2349
Registriert: 10.12.2008 10:51:41

Re: Script für eine Bash Ausgabe

Beitrag von tobo » 08.11.2020 00:27:19

Dir ist schon klar, was read (von dir vorgeschlagen) so macht und dass da eine Abfrage erwartet wird, die man aber natürlich auch leer abschließen kann? Aber ja, erkläre das nochmal (mit besonderem Augenmerk auf Eingabe/Ausgabe; was hast du, was willst du) und dann am besten auf mögliche Rückfragen gezielt Antworten. Erhöht vielleicht deine Chancen...

Benutzeravatar
alboran
Beiträge: 96
Registriert: 15.09.2009 14:24:48

Re: Script für eine Bash Ausgabe

Beitrag von alboran » 08.11.2020 00:32:41

Danke

LG
ThinkPad T540p mit ArchLinux DebianFluxbox

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Script für eine Bash Ausgabe

Beitrag von Meillo » 08.11.2020 10:41:31

Ich stimme tobo zu, dass es schwer ist, nachzuvollziehen, was du haben willst. Du hast dein Anliegen sehr abstrakt und ohne Kontext formuliert. Konkreter zu wissen worum es geht, was die Anwendungsszenarien des Scriptes sind, hilft meist beim Verstehen weiter.


Zum Technischen ein paar Gedanke, die mir schon gekommen sind:

- Wenn es TR als Variable schon gibt, dann muss sie exportiert sein, wenn du sie im Script verwenden willst. Nur exportierte Variablen werden als Kindprozesse (d.h. Scripte) weitergereicht. Du kannst sie dort lesen, aber nicht fuer die umgebende Shell veraendern, falls das relevant waere.

- Einfach nur ein Script zu erstellen scheint nicht dein eigentliches Anliegen zu sein, denn dafuer musst du ja nur deinen Befehl in eine Datei schreiben, ``#!/bin/bash'' davor setzen und die Datei ausfuehrbar machen. Dir geht es wohl eher um zusaetzliche Funktionalitaeten, die das Script haben soll. Welche genau verstehe ich noch nicht.

- Diese Datei, in der du die Ausgaben schreibst, wo liegt die? An einem absoluten Ort, oder relativ zum Verzeichnis aus dem man das Script aufruft?

- Der Input scheint zum Teil aus Umgebungsvariablen zu kommen (TR) und zum Teil durch interaktive Abfragen (`read -p') eingelesen zu werden. Vielleicht kannst du auflisten, was alles Input fuer das Script und seine Ausgabe sind.
Use ed once in a while!

Benutzeravatar
alboran
Beiträge: 96
Registriert: 15.09.2009 14:24:48

Re: Script für eine Bash Ausgabe

Beitrag von alboran » 08.11.2020 12:15:14

Ja da gebe ich dir recht. Es war wohl doch ein bisschen spät gestern.
Ich hebe die Anfrage entsprechend geändert und hoffe das es so verständlicher ist.

Die Datei liegt an einem absoluten Ort

Code: Alles auswählen

[muff@muff ~]$ echo -e "\n${TR} \n$(date +'%a. %d %b. A.D. %Y') \n\n${JOSB} \n\nTanke \nEdeka"

=====================================				#Variable
 
So. 08 Nov. A.D. 2020 									#Datumsvariable

Mattie xxxx 443 67 19 									#Inputvariable
Jasper xxxx 87 82 99 54 									|
Sophie xxxx 332 84 31 										|
Noa xxxx 569 91 44 										|

Tanke 												#Sonstige Eingabe(n)
Edeka
[muff@muff ~]$
und das ganze soll letztendlich so in die Datei eingetragen werden.

LG
ThinkPad T540p mit ArchLinux DebianFluxbox

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Script für eine Bash Ausgabe

Beitrag von Meillo » 08.11.2020 12:49:44

Langsam wird es verstaendlicher, danke.
alboran hat geschrieben: ↑ zum Beitrag ↑
08.11.2020 12:15:14

Code: Alles auswählen

[muff@muff ~]$ echo -e "\n${TR} \n$(date +'%a. %d %b. A.D. %Y') \n\n${JOSB} \n\nTanke \nEdeka"

=====================================				#Variable
 
So. 08 Nov. A.D. 2020 									#Datumsvariable

Mattie xxxx 443 67 19 									#Inputvariable
Jasper xxxx 87 82 99 54 									|
Sophie xxxx 332 84 31 										|
Noa xxxx 569 91 44 										|

Tanke 												#Sonstige Eingabe(n)
Edeka
[muff@muff ~]$
Dann hier mal ein Anfang:

Code: Alles auswählen

#!/bin/bash

## 0) Fixdaten
datei=/pfad/zur/datei

## 1) Daten sammeln
# TR ist eine Umgebungsvariable
# JOSB ist eine Umgebungsvariable
datum=$(date +'%a. %d %b. A.D. %Y')
echo "Zusatzeingaben fuer $datum (mit Strg-D beenden):"
zusatz="$(cat)"

## 2) Ausgabe
printf "\n%s\n%s\n\n%s\n\n%s\n" "$TR" "$datum" "$JOSB" "$zusatz" >"$datei"
Anmerkungen:

- Einlesen der Zusatzdaten per cat statt read, um mehrzeilige Eingaben zu erlauben.

Fragen:

- Gibt es einen Grund, warum TR ausserhalb des Scripts definiert ist? Aendert sich das? In welcher Weise?

- Woher kommt JOSB? Macht es Sinn, das als Umgebungsvariable zu uebergeben? Waere es als Argument nicht sinnvoller?

- Warum fuer die Zusatziinformationen nicht Kommandozeilenargumente verwenden?


Ich hoffe, damit kommst du weiter.
Use ed once in a while!

Benutzeravatar
alboran
Beiträge: 96
Registriert: 15.09.2009 14:24:48

Re: Script für eine Bash Ausgabe

Beitrag von alboran » 08.11.2020 20:03:53

@ Meillo

Danke, das geht schon in die richtige Richtung. Allerdings übernimmt 'printf' nicht die Formate '\n' in den Variablen.
Ich hatte grade erst angefangen mich ein bischen mit dem Scripting auseinander zu setzen und da sind mir die Variablen und die Array's untergekommen.
- Gibt es einen Grund, warum TR ausserhalb des Scripts definiert ist? Aendert sich das? In welcher Weise?
Das stellt eigentlich nur die Trennlinie dar. Kann man bestimmt eleganter lösen....
- Woher kommt JOSB? Macht es Sinn, das als Umgebungsvariable zu uebergeben? Waere es als Argument nicht sinnvoller?
Das ist die 'Jugend Orchester Schule Berlin', darin habe ich die Schüler*innen zusammengefasst.
- Warum fuer die Zusatziinformationen nicht Kommandozeilenargumente verwenden?
Ich bin gerne für jegliche Anregung offen, wie gesagt, bin noch ganz am Anfang und würde mich gerne eingehender mit diesem Thema auseinandersetzen.
printf "\n%s\n%s\n\n%s\n\n%s\n"
Was bewirkt diese Formatkette in bezug auf 'printf'?

Danke für deine Bemühungen.

LG
ThinkPad T540p mit ArchLinux DebianFluxbox

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Script für eine Bash Ausgabe

Beitrag von Meillo » 08.11.2020 20:26:12

alboran hat geschrieben: ↑ zum Beitrag ↑
08.11.2020 20:03:53
Allerdings übernimmt 'printf' nicht die Formate '\n' in den Variablen.
Welche Variable meinst du damit? JOSB? Oder eine andere?
Ich hatte grade erst angefangen mich ein bischen mit dem Scripting auseinander zu setzen und da sind mir die Variablen und die Array's untergekommen.
Mit Arrays kenne ich mich nicht aus. Da muss sich ein Bash-Experte dazu aeussern. ich weiss allerdings nicht, wozu du hier Arrays braeuchtest.
- Gibt es einen Grund, warum TR ausserhalb des Scripts definiert ist? Aendert sich das? In welcher Weise?
Das stellt eigentlich nur die Trennlinie dar. Kann man bestimmt eleganter lösen....
Dann definiere sie innerhalb des Scripts als lokale Variable:

Code: Alles auswählen

TR="$(yes '' | head -n 60 | tr \\n =)"
# oder
TR="===================================="
# ... was dir lieber ist
- Woher kommt JOSB? Macht es Sinn, das als Umgebungsvariable zu uebergeben? Waere es als Argument nicht sinnvoller?
Das ist die 'Jugend Orchester Schule Berlin', darin habe ich die Schüler*innen zusammengefasst.
Wie kommt denn der Wert in die Variable? Speicherst du die manuell? Kommt die Ausgabe aus einem Programm? Warum speicherst du die in einer Variable und nicht in einer Datei? Waere das nicht sinnvoller?

Was genau steht da drinnen: \n oder mehrzeiliger Text? Also:

Code: Alles auswählen

JOSB="foo\nbar\nbaz\nquux"
# oder
JOSB="foo
bar
baz
quux"
- Warum fuer die Zusatziinformationen nicht Kommandozeilenargumente verwenden?
Ich bin gerne für jegliche Anregung offen, wie gesagt, bin noch ganz am Anfang und würde mich gerne eingehender mit diesem Thema auseinandersetzen.
Derzeit ist die Hauptschwierigkeit fuer mich noch immer, herauszufinden wie die Dinge zusammenhaengen, und damit welche Anforderungen fix sind und wo ich ueberall rumschrauben kann. Meine Rueckfragen werden weiteres klaeren. Wenn ich dazu komme, versuche ich gerne am Ende noch eine Umsetzung zu posten, wie ich es machen wuerde, wenn es ein Script fuer mich selber waere.
printf "\n%s\n%s\n\n%s\n\n%s\n"
Was bewirkt diese Formatkette in bezug auf 'printf'?
Schau dir mal die Manpage zu printf an: `man printf'.

An die Stelle jedes `%s' wird der Text vom naechsten folgenden Argument eingesetzt. So ist es einfacher die Werte und die Formatierung zu trennen. Das macht es ueber sichtlicher.
Use ed once in a while!

Benutzeravatar
alboran
Beiträge: 96
Registriert: 15.09.2009 14:24:48

Re: Script für eine Bash Ausgabe

Beitrag von alboran » 08.11.2020 20:49:29

Dann definiere sie innerhalb des Scripts als lokale Variable:
CODE: ALLES AUSWÄHLEN

TR="$(yes '' | head -n 60 | tr \\n =)"
# oder
TR="===================================="
# ... was dir lieber ist
Das habe ich so übernommen.
Welche Variable meinst du damit? JOSB? Oder eine andere?
Ja die meine ich.
Wie kommt denn der Wert in die Variable? Speicherst du die manuell? Kommt die Ausgabe aus einem Programm? Warum speicherst du die in einer Variable und nicht in einer Datei? Waere das nicht sinnvoller?

Was genau steht da drinnen: \n oder mehrzeiliger Text? Also:
CODE: ALLES AUSWÄHLEN

JOSB="foo\nbar\nbaz\nquux"
Ich hatte die so angelegt und dann als 'export JOSB="xxxxxxxxxx" in der .bash_profile hinterlegt.

Fix sind eigentlich nur 'TR' 'datum' und 'datei'. Die Variable 'JOSB' würde ich gerne austauschen können und dann halt die zusätzlichen Eingaben über 'cat' machen können.
ThinkPad T540p mit ArchLinux DebianFluxbox

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Script für eine Bash Ausgabe

Beitrag von Meillo » 08.11.2020 21:01:46

alboran hat geschrieben: ↑ zum Beitrag ↑
08.11.2020 20:49:29
JOSB="foo\nbar\nbaz\nquux"
Ich hatte die so angelegt und dann als 'export JOSB="xxxxxxxxxx" in der .bash_profile hinterlegt.
Das ist sehr unueblich. ;-) Viel ueblicher waere es, eine Datei anzulegen, z.B. irgendwo im Homeverzeichnis oder dort wo die Ausgabedatei liegt, und dort die Daten eintragen. Nicht nur, dass man sie dort eher erwarten wuerde (also der Normaluser), sie liesse sich auch besser editieren, und du koenntest sie zusaetzlich in anderer Weise auswerten: die Eintraege zaehlen, sie sortieren, nur manche ausgeben, etc.

Versteh' mich nicht falsch: Du kannst das schon so machen wie du es jetzt hast. Aber wenn du keine guten Gruende fuer die jetzige Loesung hast, wuerde ich dir empfehlen, es auf die von mir vorgeschlagene Weise zu machen.

Um die Daten erstmalig in eine Datei zu ueberfuehren, kannst du folgenden Befehl verwenden:

Code: Alles auswählen

echo "$JOSB" >josb.txt
Dann kannst du die Datei an einen passenden Ort verschieben und die Zeile in der .bash_profile entfernen.

Im Script fuegst du dann eine neue Zeile im Variablen-Abschnitt ein:

Code: Alles auswählen

JOSB="$(cat /pfad/zu/josb.txt)"
Das war's schon. :-)

Fix sind eigentlich nur 'TR' 'datum' und 'datei'. Die Variable 'JOSB' würde ich gerne austauschen können und dann halt die zusätzlichen Eingaben über 'cat' machen können.
Oder alternativ, falls du mehrere JOSB-Werte hast, die du dann in mehrere Dateien speicherst, dann uebergib die passende Datei als Kommandozeilenargument:

Code: Alles auswählen

$ deinscript /pfad/zu/josb312.txt
Und im Script:

Code: Alles auswählen

JOSB="$(cat "$1")"
Ich hoffe, damit kommst du weiter. Spiel ruhig ein wenig damit rum. Sonst einfach wieder fragen. ;-)
Use ed once in a while!

Benutzeravatar
alboran
Beiträge: 96
Registriert: 15.09.2009 14:24:48

Re: Script für eine Bash Ausgabe

Beitrag von alboran » 08.11.2020 21:14:56

Danke dir Meillo
manchmal hat man so eine "tolle" Idee und möchte sie gerne zu Ende führen und dann geht's auf einmal doch einfacher :wink:
Ich werde mich dem mal annehmen und damit ein wenig rum experimentieren.
Sieht jedenfalls nach einem gepflegteren Lösungsansatz aus. :THX:

LG alboran
ThinkPad T540p mit ArchLinux DebianFluxbox

Benutzeravatar
Meillo
Moderator
Beiträge: 9241
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Script für eine Bash Ausgabe

Beitrag von Meillo » 08.11.2020 21:23:31

alboran hat geschrieben: ↑ zum Beitrag ↑
08.11.2020 21:14:56
manchmal hat man so eine "tolle" Idee und möchte sie gerne zu Ende führen und dann geht's auf einmal doch einfacher :wink:
Perfektion ist dann erreicht, wenn man nichts mehr weglassen kann. ;-)
Ich werde mich dem mal annehmen und damit ein wenig rum experimentieren.
Gut. Selber rumzuspielen ist wichtig. Da lernt man am meisten. Wenn du nicht mehr weiter kommst (oder wenn du eine fertige Loesung hast ;-) ), dann melde dich wieder. Ich bin schon gespannt, wie sich dein Projekt weiter entwickelt.
Use ed once in a while!

Benutzeravatar
alboran
Beiträge: 96
Registriert: 15.09.2009 14:24:48

Re: Script für eine Bash Ausgabe

Beitrag von alboran » 08.11.2020 21:30:45

Gut. Selber rumzuspielen ist wichtig. Da lernt man am meisten. Wenn du nicht mehr weiter kommst (oder wenn du eine fertige Loesung hast ;-) ), dann melde dich wieder. Ich bin schon gespannt, wie sich dein Projekt weiter entwickelt
Werde ich auf jeden Fall machen. :THX: :THX:
ThinkPad T540p mit ArchLinux DebianFluxbox

Antworten