Hoe kan ik automatisch gegevens naar een tekstbestand schrijven door shellscripting in Linux?
Ik heb het bestand kunnen openen. Ik weet echter niet hoe ik er gegevens naar moet schrijven.
Antwoord 1, autoriteit 100%
Het korte antwoord:
echo "some data for the file" >> fileName
Echter, echo
gaat niet over end-of-line-tekens (EOF’s) in een ideale manier. Dus, als je meer dan één regel wilt toevoegen, doe het dan met printf
:
printf "some data for the file\nAnd a new line" >> fileName
De operators >>
en >
zijn erg handig voor het omleiden van de uitvoer van commando’s, ze werken met meerdere andere bash-commando’s.
Antwoord 2, autoriteit 32%
#!/bin/sh
FILE="/path/to/file"
/bin/cat <<EOM >$FILE
text1
text2 # This comment will be inside of the file.
The keyword EOM can be any text, but it must start the line and be alone.
EOM # This will be also inside of the file, see the space in front of EOM.
EOM # No comments and spaces around here, or it will not work.
text4
EOM
Antwoord 3, autoriteit 14%
U kunt de uitvoer van een opdracht omleiden naar een bestand:
$ cat file > copy_file
of eraan toevoegen
$ cat file >> copy_file
Als je direct wilt schrijven, is het commando echo 'text'
$ echo 'Hello World' > file
Antwoord 4, autoriteit 11%
#!/bin/bash
cat > FILE.txt <<EOF
info code info
info code info
info code info
EOF
Antwoord 5, autoriteit 6%
Ik weet dat dit een verdomd oude vraag is, maar aangezien de OP over scripting gaat, en vanwege het feit dat Google me hier heeft gebracht, moet ook het openen van bestandsdescriptors voor lezen en schrijven tegelijk worden vermeld.
#!/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>&-
Vervolgens cat
het bestand op terminal
$ cat poem.txt
Roses are red
Violets are blue
Poems are cute
And so are you
Dit voorbeeld zorgt ervoor dat het bestand poem.txt open staat voor lezen en schrijven in bestandsdescriptor 3. Het laat ook zien dat *nix-boxen meer fd’s kennen dan alleen stdin, stdout en stderr (fd 0,1,2). Het houdt eigenlijk veel in. Gewoonlijk is het maximale aantal bestandsdescriptors dat de kernel kan toewijzen te vinden in /proc/sys/file-max
of /proc/sys/fs/file-max
maar met elke fd boven 9 is gevaarlijk omdat het in conflict kan komen met fd’s die intern door de shell worden gebruikt. Dus doe geen moeite en gebruik alleen fd’s 0-9. Als je meer van de 9 bestandsdescriptors in een bash-script nodig hebt, moet je toch een andere taal gebruiken 🙂
Hoe dan ook, fd’s kunnen op veel interessante manieren worden gebruikt.
Antwoord 6, autoriteit 3%
Ik vind dit antwoord leuk:
cat > FILE.txt <<EOF
info code info
...
EOF
maar zou cat >> FILE.txt << EOF
als je gewoon iets aan het einde van het bestand wilt toevoegen zonder weg te vagen wat al bestaat
Zoals dit:
cat >> FILE.txt <<EOF
info code info
...
EOF
Antwoord 7, autoriteit 2%
Mijn reactie verplaatsen als antwoord, zoals gevraagd door @lycono
Als je dit met root-rechten moet doen, doe het dan op deze manier:
sudo sh -c 'echo "some data for the file" >> fileName'
Antwoord 8, autoriteit 2%
Voor omgevingen waar hier geen documenten beschikbaar zijn (Makefile
, Dockerfile
, etc) kun je vaak printf
gebruiken voor een redelijk leesbare en efficiënte oplossing .
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
Antwoord 9, autoriteit 2%
Ik dacht dat er een paar prima antwoorden waren, maar geen beknopte samenvatting van alle mogelijkheden; dus:
Het belangrijkste principe achter de meeste antwoorden hier is omleiding. Twee zijn belangrijke omleidingsoperatoren voor het schrijven naar bestanden:
Uitvoer omleiden:
echo 'text to completely overwrite contents of myfile' > myfile
Omgeleide uitvoer toevoegen
echo 'text to add to end of myfile' >> myfile
Hier documenten
Andere genoemde, in plaats van vanuit een vaste invoerbron zoals echo 'text'
, kunt u ook interactief naar bestanden schrijven via een “Here Document”, die ook worden beschreven in de link naar de bash handleiding hierboven. Die antwoorden, b.v.
cat > FILE.txt <<EOF
of cat >> FILE.txt <<EOF
maak gebruik van dezelfde omleidingsoperatoren, maar voeg een andere laag toe via “Here Documents”. In de bovenstaande syntaxis schrijft u naar de FILE.txt via de uitvoer van cat
. Het schrijven vindt pas plaats nadat de interactieve invoer een specifieke tekenreeks heeft gekregen, in dit geval ‘EOF’, maar dit kan elke willekeurige tekenreeks zijn, bijvoorbeeld:
cat > FILE.txt <<'StopEverything'
of cat >> FILE.txt <<'StopEverything'
zou net zo goed werken. Hier zoeken Documenten ook naar verschillende scheidingstekens en andere interessante parseertekens, dus bekijk de documenten voor meer informatie hierover.
Hier strings
Een beetje ingewikkeld, en meer een oefening in het begrijpen van zowel de omleiding als de Here Documents-syntaxis, maar u zou de Here Document-stijlsyntaxis kunnen combineren met standaard omleidingsoperatoren om een Here-string te worden:
Uitvoer van kat-invoer omleiden
cat > myfile <<<'text to completely overwrite contents of myfile'
Omgeleide uitvoer van cat-invoer toevoegen
cat >> myfile <<<'text to completely overwrite contents of myfile'
Antwoord 10
Kan hier ook document en vi gebruiken, het onderstaande script genereert een FILE.txt met 3 regels en variabele interpolatie
VAR=Test
vi FILE.txt <<EOFXX
i
#This is my var in text file
var = $VAR
#Thats end of text file
^[
ZZ
EOFXX
Het bestand heeft dan 3 regels zoals hieronder. “i” is om de vi-invoegmodus te starten en op dezelfde manier het bestand te sluiten met Esc en ZZ.
#This is my var in text file
var = Test
#Thats end of text file
Antwoord 11
Als u variabelen gebruikt, kunt u
first_var="Hello"
second_var="How are you"
Als je beide strings wilt samenvoegen en naar een bestand wilt schrijven, gebruik dan hieronder
echo "${first_var} - ${second_var}" > ./file_name.txt
Uw bestandsnaam.txt-inhoud is “Hallo – Hoe gaat het”
Antwoord 12
dit is mijn antwoord.
$ cat-bestand > copy_file