ฉันจะเขียนข้อมูลไปยังไฟล์ข้อความโดยอัตโนมัติด้วยการเขียนสคริปต์เชลล์ใน Linux ได้อย่างไร
ฉันสามารถเปิดไฟล์ได้ อย่างไรก็ตามฉันไม่ทราบวิธีการเขียนข้อมูล
ฉันจะเขียนข้อมูลไปยังไฟล์ข้อความโดยอัตโนมัติด้วยการเขียนสคริปต์เชลล์ใน Linux ได้อย่างไร
ฉันสามารถเปิดไฟล์ได้ อย่างไรก็ตามฉันไม่ทราบวิธีการเขียนข้อมูล
คำตอบ:
echo "some data for the file" >> fileName
sudo sh -c 'echo "some data for the file" >> fileName'
#!/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
คุณสามารถเปลี่ยนทิศทางเอาต์พุตของคำสั่งไปยังไฟล์:
$ cat file > copy_file
หรือผนวกเข้ากับมัน
$ cat file >> copy_file
หากคุณต้องการเขียนคำสั่งโดยตรง echo 'text'
$ echo 'Hello World' > file
sudo sh -c 'cat file > /etc/init/gunicorn.conf'
(ต้องขอบคุณความเห็นของลูเคอราทด้านบน)
#!/bin/bash
cat > FILE.txt <<EOF
info code info
info code info
info code info
EOF
cat > FILE.txt
แล้วกด Ctrl + D เมื่อคุณทำเสร็จแล้ว
ฉันรู้ว่านี่เป็นคำถามเก่า ๆ ที่น่ากลัว แต่เนื่องจาก OP เป็นเรื่องเกี่ยวกับการเขียนสคริปต์และสำหรับความจริงที่ว่า google นำฉันมาที่นี่การเปิดตัวอธิบายไฟล์สำหรับการอ่านและการเขียนในเวลาเดียวกันก็ควรได้รับการกล่าวถึงเช่นกัน
#!/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>&-
จากนั้นcat
ไฟล์ใน terminal
$ cat poem.txt
Roses are red
Violets are blue
Poems are cute
And so are you
ตัวอย่างนี้ทำให้ไฟล์ poem.txt เปิดให้อ่านและเขียนบน file descriptor 3 นอกจากนี้ยังแสดงให้เห็นว่ากล่อง * nix รู้ถึง fd มากขึ้นแล้วแค่ stdin, stdout และ stderr (fd 0,1,2) มันถือจริงมาก โดยปกติแล้วจำนวนไฟล์อธิบายสูงสุดที่เคอร์เนลสามารถจัดสรรสามารถพบได้ใน/proc/sys/file-max
หรือ/proc/sys/fs/file-max
แต่การใช้ fd ด้านบน 9 เป็นอันตรายเพราะมันอาจขัดแย้งกับ fd ที่เชลล์ใช้ภายใน ดังนั้นอย่ากังวลและใช้เฉพาะ fd's 0-9 เท่านั้น หากคุณต้องการตัวอธิบายไฟล์มากกว่า 9 ไฟล์ในสคริปต์ทุบตีคุณควรใช้ภาษาอื่นต่อไป :)
อย่างไรก็ตาม fd สามารถใช้ในวิธีที่น่าสนใจมากมาย
ฉันชอบคำตอบนี้:
cat > FILE.txt <<EOF
info code info
...
EOF
แต่จะแนะนำcat >> FILE.txt << EOF
ถ้าคุณต้องการเพิ่มบางสิ่งบางอย่างในตอนท้ายของไฟล์โดยไม่ต้องลบสิ่งที่มีอยู่แล้ว
แบบนี้:
cat >> FILE.txt <<EOF
info code info
...
EOF
การย้ายความคิดเห็นของฉันเป็นคำตอบตามที่ @lycono ร้องขอ
หากคุณต้องการทำสิ่งนี้ด้วยสิทธิ์พิเศษของรูทให้ทำดังนี้:
sudo sh -c 'echo "some data for the file" >> fileName'
echo "some data for the file" | sudo tee -a fileName >/dev/null
จะเรียกใช้tee
เป็นรากเท่านั้น
สำหรับสภาพแวดล้อมที่ไม่มีเอกสารที่นี่ ( Makefile
,, Dockerfile
ฯลฯ ) คุณมักจะสามารถใช้printf
เพื่อแก้ปัญหาที่ชัดเจนและมีประสิทธิภาพ
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
ฉันคิดว่ามีคำตอบที่ดีอย่างสมบูรณ์ แต่ก็ไม่มีข้อสรุปที่เป็นไปได้ทั้งหมด ดังนี้:
หลักหลักที่อยู่เบื้องหลังคำตอบมากที่สุดนี่คือการเปลี่ยนเส้นทาง สองตัวดำเนินการเปลี่ยนเส้นทางที่สำคัญสำหรับการเขียนไปยังไฟล์:
echo 'text to completely overwrite contents of myfile' > myfile
echo 'text to add to end of myfile' >> myfile
คนอื่นพูดถึงแทนที่จะมาจากแหล่งอินพุตคงที่เช่นecho 'text'
คุณสามารถเขียนโต้ตอบไฟล์ผ่าน "Here Document" ซึ่งมีรายละเอียดในลิงก์ไปยังคู่มือทุบตีด้านบน คำตอบเหล่านั้นเช่น
cat > FILE.txt <<EOF
หรือ cat >> FILE.txt <<EOF
ใช้ประโยชน์จากโอเปอเรเตอร์การเปลี่ยนเส้นทางเดียวกัน แต่เพิ่มเลเยอร์อื่นผ่าน "เอกสารที่นี่" ในไวยากรณ์ข้างต้นคุณเขียนถึง file.txt cat
ผ่านการส่งออกของ การเขียนจะเกิดขึ้นหลังจากอินพุตอินเทอร์แอคทีฟได้รับสตริงเฉพาะบางอย่างเท่านั้นในกรณีนี้ 'EOF' แต่อาจเป็นสตริงใด ๆ ก็ได้เช่น:
cat > FILE.txt <<'StopEverything'
หรือ cat >> FILE.txt <<'StopEverything'
ก็จะทำงานได้เช่นกัน ที่นี่เอกสารยังมองหาตัวคั่นต่างๆและอักขระการแยกวิเคราะห์ที่น่าสนใจอื่น ๆ ดังนั้นให้ดูที่เอกสารสำหรับข้อมูลเพิ่มเติมเกี่ยวกับเรื่องนั้น
ซับซ้อนเล็กน้อยและมีแบบฝึกหัดเพิ่มเติมในการทำความเข้าใจกับทั้งการเปลี่ยนเส้นทางและที่นี่เอกสารไวยากรณ์ แต่คุณสามารถรวมที่นี่สไตล์ไวยากรณ์ของเอกสารที่นี่กับผู้ประกอบการเปลี่ยนเส้นทางมาตรฐานที่จะกลายเป็นสตริงที่นี่:
การเปลี่ยนเส้นทางเอาต์พุตของ cat Inputcat > myfile <<<'text to completely overwrite contents of myfile'
cat >> myfile <<<'text to completely overwrite contents of myfile'
ยังสามารถใช้ที่นี่เอกสารและ vi สคริปต์ด้านล่างสร้าง FILE.txt ที่มี 3 บรรทัดและการแก้ไขตัวแปร
VAR=Test
vi FILE.txt <<EOFXX
i
#This is my var in text file
var = $VAR
#Thats end of text file
^[
ZZ
EOFXX
จากนั้นไฟล์จะมี 3 บรรทัดดังต่อไปนี้ "i" คือการเริ่มโหมดแทรก vi และในทำนองเดียวกันเพื่อปิดไฟล์ด้วย Esc และ ZZ
#This is my var in text file
var = Test
#Thats end of text file