Echoコマンドとリダイレクト演算子を使用してファイルを作成したいのですが、ファイルは数行で構成する必要があります。
文字列内に「\ n」で改行を含めようとしました:
echo "first line\nsecond line\nthirdline\n" > foo
しかし、この方法では、3行のファイルは作成されませんが、1行と文字列の逐語的な内容のみのファイルが作成されます。
このコマンドだけを使用して、数行のファイルを作成するにはどうすればよいですか?
echo
コマンドでいくつかの構文を使用するように求めました:
echo $'first line\nsecond line\nthirdline' > foo
(しかし、あなたが得た他の答えも考慮してください。)
$'...'
構文は、埋め込まれたANSIエスケープシーケンスを展開します。
エコーが文字エスケープで行うのは、実装定義です。エコーの多くの実装(最新のものを含む)では、渡された文字列はデフォルトでエスケープについてまったく検査されません。
GNU bash(組み込みとして)によって提供されるエコー、および他のいくつかのエコーバリアントを使用すると、次のようなことができます。
echo -en 'first line\nsecond line\nthird line\n' > file
ただし、実際にはprintf
が必要だと思います。これは私の目には読みやすく、移植性も高くなっています(この機能はPOSIXで定義されています)。
printf '%s\n' 'first line' 'second line' 'third line' > file
hereドキュメント の使用も検討してください。
cat > file << 'EOF'
first line
second line
third line
EOF
echo
コマンドを使用して複数行のファイルを作成する他のいくつかの方法を次に示します。
echo "first line" > foo
echo "second line" >> foo
echo "third line" >> foo
ここで、2番目と3番目のコマンドは>>
リダイレクト演算子を使用します。これにより、コマンドの出力がファイル(この時点で既に存在しているはずです)に追加(追加)されます。
または
(echo "first line"; echo "second line"; echo "third line") > foo
ここで、括弧はecho
コマンドを1つのサブプロセスにグループ化します。これは、複数の行を出力する単一のプログラム(ls
など)のように見え、動作します。
上記の微妙なバリエーションは
{ echo "first line"; echo "second line"; echo "third line";} > foo
これは、サブプロセスを作成しないという点で、2番目の回答よりも少しより効率的です。ただし、構文は少しトリッキーです。{
の後にスペースを入れ、}
の前にセミコロンを付ける必要があることに注意してください。
詳細については、 シェルの制御およびリダイレクト演算子とは を参照してください。
さらに別のオプションを与えるには、 Enter (つまり、文字通りの改行):
$ echo "the rain in spain
> falls mainly on the plain" > foo
2行目の先頭に>
を入力しないことに注意してください。これが2番目のシェルプロンプト$PS2
であり、不完全なコマンド(この場合、一致しない引用文字を含むコマンドなど)を入力するとシェルが出力します。
POSIX 7はできないと言っています
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html
-e
は定義されておらず、バックスラッシュは実装で定義されています。
最初のオペランドが-nの場合、またはいずれかのオペランドに<backslash>文字が含まれている場合、結果は実装定義です。
オプションのXSI拡張機能がない限り。
代わりに printf
を使用してください:
formatオペランドは、XBDファイル形式表記[...]で説明されている形式文字列として使用されます。
ファイル形式表記 :
\ n <改行>印刷位置を次の行の先頭に移動します。
また、Ubuntu 15.10とほとんどのディストリビューションはecho
を次のように実装しています:
help echo
which echo
混乱を招く可能性があります。