Linuxでシェルスクリプトを使用してテキストファイルにデータを自動的に書き込むにはどうすればよいですか?
ファイルを開くことができました。しかし、データの書き方がわかりません。
簡単な答え:
echo "some data for the file" >> fileName
ただし、echo
理想的な方法で行末文字(EOF)を処理しません。したがって、複数の行を追加する場合は、次のようにしますprintf
。
printf "some data for the file\nAnd a new line" >> fileName
>>
and演算子は、コマンドの出力をリダイレクト>
するのに非常に便利です。これらは、他の複数のbashコマンドで機能します。
#!/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
#!/bin/bash
cat > FILE.txt <<EOF
info code info
info code info
info code info
EOF
これは非常に古い質問ですが、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
、ターミナル上のファイル
$ cat poem.txt
Roses are red
Violets are blue
Poems are cute
And so are you
この例では、ファイルpoem.txtがファイル記述子3の読み取りと書き込みのために開かれます。また、* nixボックスは、stdin、stdout、およびstderr(fd 0,1,2)よりも多くのfdを認識していることも示しています。それは実際にたくさんあります。通常、カーネルが割り当てることができるファイル記述子の最大数は、/proc/sys/file-max
またはで見つけることができますが、 /proc/sys/fs/file-max
9を超えるfdを使用すると、シェルが内部で使用するfdと競合する可能性があるため危険です。したがって、気にせず、fdの0〜9のみを使用してください。bashスクリプトでさらに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'
ヒアドキュメントが利用できない環境(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
完全に細かい答えがいくつかあると思いましたが、すべての可能性の簡潔な要約はありませんでした。したがって:
ここでのほとんどの回答の背後にあるコアプリンシパルはリダイレクトです。ファイルに書き込むための重要なリダイレクト演算子は次の2つです。
echo 'text to completely overwrite contents of myfile' > myfile
echo 'text to add to end of myfile' >> myfile
のような固定入力ソースからではなく、echo 'text'
上記のbashマニュアルへのリンクで詳しく説明されている「ヒアドキュメント」を介して、インタラクティブにファイルに書き込むこともできます。それらの答え、例えば
cat > FILE.txt <<EOF
またcat >> FILE.txt <<EOF
同じリダイレクト演算子を使用しますが、「ヒアドキュメント」を介して別のレイヤーを追加します。上記の構文では、の出力を介してFILE.txtに書き込みますcat
。書き込みは、対話型入力に特定の文字列(この場合は「EOF」)が与えられた後にのみ行われますが、これは任意の文字列にすることができます。例:
cat > FILE.txt <<'StopEverything'
またcat >> FILE.txt <<'StopEverything'
同様に機能します。ヒアドキュメントでは、さまざまな区切り文字やその他の興味深い解析文字も検索されるため、ドキュメントで詳細を確認してください。
少し複雑で、リダイレクトとヒアドキュメント構文の両方を理解するための演習ですが、ヒアドキュメントスタイルの構文を標準のリダイレクト演算子と組み合わせて、ヒア文字列にすることができます。
cat入力の出力のリダイレクトcat > myfile <<<'text to completely overwrite contents of myfile'
cat >> myfile <<<'text to completely overwrite contents of myfile'
ヒアドキュメントとviも使用できます。以下のスクリプトは、3行と変数補間を含むFILE.txtを生成します。
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
変数を使用している場合は、次を使用できます
first_var="Hello"
second_var="How are you"
両方の文字列を連結してファイルに書き込む場合は、以下を使用してください
echo "${first_var} - ${second_var}" > ./file_name.txt
file_name.txtの内容は「こんにちは-お元気ですか」になります
このアプローチは機能し、最高です
cat > (filename) <<EOF
Text1...
Text2...
EOF
基本的に、テキストはファイルの書き込み/追加が終了するまでキーワード「EOF」を検索します
これが私の答えです。$catファイル>copy_file