Shell-script: Datei einlesen

Hallo,

Ich schreibe mir ein (neues) Backup-Script. Die zu sichernden Verzeichnisse ($ARG_LIST) möchte ich zwecks Übersichtlichkeit in einem separaten Textfile ($CONFIGFILE) ablegen.

…aber wie lese ich eine Argumentliste aus einer Datei? Die Datei enthält je Zeile 1 Argument (Verzeichnisname).

Mit ‚meiner‘ Syntax sähe das so aus, aber so will es natürlich die bash nicht :wink:

#!/bin/bash

ARG\_LIST=""

do while not EOF
 $ARG\_LIST = $ARG\_LIST + " " + readline($CONFIGFILE)
loop 

for BACKUPDIRS in $ARG\_LIST ; do
 tar cfz ...
done
exit 0

Bitte gebt mir ein paar Anhaltspunkte, danke!

ciao - Axel

hi!

#!/bin/bash

ARG_LIST=""

CONFIGFILE=„mein.file“

cat $CONFIGFILE
while read INP
do
if ["$INP" = „EOF“] ; then break; fi
ARG_LIST="$ARG_LIST $INP"

done

exit 0

sollte eigentlich funktionieren

gruss
mip

#!/bin/bash

cat $CONFIGFILE
while read INP
do
if ["$INP" = „EOF“] ; then break; fi
ARG_LIST="$ARG_LIST $INP"

done

sollte eigentlich funktionieren

Vielen Dank, mip, für Deine Mühe. Leider funktioniert es so aber nicht. Das Script hängt beim ‚read‘ Befehl und wartet auf Input von stdin. Und ‚cat‘ hat hier irgendwie keinen Sinn.

‚Linux in a Nutshell‘ schreibt, dass ‚read‘ die übergebene Anzahl von Argumenten von stdin liest und liefert ein Beispiel:

# read Vorname Nachname Ort
# Rudi Ratlos Koeln
# echo "$Nachname, $Vorname aus $Ort"
# Ratlos, Rudi aus Koeln
#

Da ich aber mehrere Zeilen in meiner $CONFIGFILE habe, würde dass - wie in Deinem Beispiel - nicht funktionieren. Es sei denn, dass ich alle Parameter in eine Zeile schreibe und stdin von kbd auf diese Datei umbiege.

Weitere Ideen?

thx again, Axel

Da ich aber mehrere Zeilen in meiner $CONFIGFILE habe,
würde dass - wie in Deinem Beispiel - nicht funktionieren. Es
sei denn, dass ich alle Parameter in eine Zeile schreibe und
stdin von kbd auf diese Datei umbiege.

Genau das habe ich getan:

#!/bin/bash
CFGFILE=test.cfg
ARG\_LIST=""

while read ZEILE
 do
 ARG\_LIST="$ARG\_LIST $ZEILE"
 done 
thx - Axel

hi

dat da sollte auch funken

ARG_LIST=cat $CFGFILE

ciao
christian

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

dat da sollte auch funken

ARG_LIST=cat $CFGFILE

Ja, aber verstehen tu’ ich’s nicht.

lexmex@cannon:/usr/local/bin/examples # echo `cat test.cfg`
test datei für backup script
lexmex@cannon:/usr/local/bin/examples # cat test.cfg
test
datei
für
backup
script
lexmex@cannon:/usr/local/bin/examples #

Obwohl beides derselbe Befehl ist (cat …), ist die Ausgabe unterschiedlich (mit/ohne Zeilenumbruch). Deshalb kam ‚cat‘ für mich nie in Frage.
Kannst Du - oder jemand anders - den Zusammenhang kurz erläutern? Ich kann mir schlecht Sachen merken, die nicht logisch sind :wink:

thx - Axel

ja weil das so ist
wenn man das ` zeichen in der kommandozeile verwendet spricht man von
Kommandosubstitution
damit hat man die möglichkeit den output eines programmes der auf stdout geht in der befehlszeile zu verwenden.
beispiel:

echo aktuelles datum und uhrzeit : date

es gibt da noch eine 2te möglich den output zu verwenden

dirs=cat test.cfg liefert das gleiche wie
dirs=$(cat test.cfg)

beim cat test.cfg ist die arbeit der shell erledigt und cat schreibt den inhalt auf stdout
beim cat test.cfg schaut sich die shell den output an arbeit mit ihm weiter

sodala. kompliziert wird das ganze erst, wenn ich dir jetzt sage, dass die LF’s doch noch da sind
probier mal
dirs=`cat test.cfg)
echo $dirs
echo „$dirs“

aber das nehem wir einfach so zur kenntniss da für dein script
auch folgende zeile funktionieren würde

dirs=`[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

1 Like

wenn man das ` zeichen in der kommandozeile verwendet spricht
man von Kommandosubstitution
[…]

Vielen Dank für die bildliche Darstellung, kleine Beispiele wirken manchmal Wunder.

Kommandosubstitution, ein herrliches Google-Wort :wink:

cu, Axel