it-swarm.com.de

Öffnen und Schreiben von Daten in eine Textdatei mit Bash?

Wie kann ich mit Shell-Skripten unter Linux automatisch Daten in eine Textdatei schreiben?

Ich konnte die Datei öffnen. Ich weiß jedoch nicht, wie ich Daten darauf schreiben soll.

188
Adnan
echo "some data for the file" >> fileName
317
Triton Man
#!/bin/sh

FILE="/path/to/file"

/bin/cat <<EOM >$FILE
text1
text2
text3
text4
EOM
125
coolfire

Sie können die Ausgabe eines Befehls in eine Datei umleiten:

$ cat file > copy_file

oder anhängen

$ cat file >> copy_file

Wenn Sie direkt schreiben möchten, lautet der Befehl echo 'text'

$ echo 'Hello World' > file
50
ssedano
#!/bin/bash

cat > FILE.txt <<EOF

info code info 
info code info
info code info

EOF 
40
baetacos

Ich weiß, dass dies eine verdammt alte Frage ist, aber da es sich beim OP um Scripting handelt und Google mich hierher gebracht hat, sollte auch erwähnt werden, dass Dateideskriptoren gleichzeitig zum Lesen und Schreiben geöffnet werden.

#!/bin/bash

# Open file descriptor (fd) 3 for read/write on a text file.
exec 3<> poem.txt

    # Let's print some text to fd 3
    echo "Roses are red" >&3
    echo "Violets are blue" >&3
    echo "Poems are cute" >&3
    echo "And so are you" >&3

# Close fd 3
exec 3>&-

Dann cat die Datei auf dem Terminal

$ cat poem.txt
Roses are red
Violets are blue
Poems are cute
And so are you

Dieses Beispiel bewirkt, dass die Datei poem.txt zum Lesen und Schreiben in Dateideskriptor 3 geöffnet ist. Außerdem zeigt es, dass * nix-Felder mehr FDS kennen als nur stdin, stdout und stderr (fd 0,1,2). Es hält tatsächlich viel. Normalerweise ist die maximale Anzahl von Dateideskriptoren, die der Kernel zuweisen kann, in /proc/sys/file-max oder /proc/sys/fs/file-max zu finden, aber die Verwendung von fd über 9 ist gefährlich, da dies zu Konflikten mit den von der Shell intern verwendeten fd führen kann. Also nicht stören und nur fd's 0-9 benutzen. Wenn Sie mehr als 9 Dateideskriptoren in einem Bash-Skript benötigen, sollten Sie sowieso eine andere Sprache verwenden :)

Wie auch immer, fd's können auf viele interessante Arten verwendet werden.

22
tobi

Ich mag diese Antwort:

cat > FILE.txt <<EOF

info code info 
...
EOF

aber würde cat >> FILE.txt << EOF vorschlagen, wenn Sie nur etwas an das Ende der Datei anfügen möchten, ohne dabei zu löschen, was bereits vorhanden ist

So was:

cat >> FILE.txt <<EOF

info code info 
...
EOF
12
Marat

Verschieben meines Kommentars als Antwort, wie von @lycono angefordert

Wenn Sie dies mit Root-Rechten tun müssen, gehen Sie folgendermaßen vor:

Sudo sh -c 'echo "some data for the file" >> fileName'
6
lukaserat

In Umgebungen, in denen Dokumente hier nicht verfügbar sind (Makefile, Dockerfile usw.), können Sie printf häufig für eine einigermaßen lesbare und effiziente Lösung verwenden.

printf '%s\n' '#!/bin/sh' '# Second line' \
    '# Third line' \
    '# Conveniently mix single and double quotes, too' \
    "# Generated $(date)" \
    '# ^ the date command executes when the file is generated' \
    'for file in *; do' \
    '    echo "Found $file"' \
    'done' >outputfile
4
tripleee

Kann hier auch document und vi verwenden, das unten stehende Skript erzeugt eine FILE.txt mit 3 Zeilen und variabler Interpolation

VAR=Test
vi FILE.txt <<EOFXX
i
#This is my var in text file
var = $VAR
#Thats end of text file
^[
ZZ
EOFXX

Dann hat die Datei 3 Zeilen wie unten. "i" startet den vi-Einfügemodus und schließt die Datei auf ähnliche Weise mit Esc und ZZ.

#This is my var in text file
var = Test
#Thats end of text file
0
Subodh Sharma