次のコマンドが生成されたファイルに新しい行を挿入しないのはなぜですか。回避策は何ですか?
$ echo "Line 1\r\nLine2" >> readme.txt
$ cat readme.txt
Line 1\r\nLine2
答え1
-e フラグを echo に渡し、次のように "\r\n" などのエスケープ文字を解析するようにします。
echo -e "Line 1\r\nLine2" >> readme.txt
答え2
echo
echo
これにより、単一のUnix仕様に厳密に準拠する実装に改行文字が追加されます。
echo 'line1\nline2'
ただし、これは信頼できる動作ではありません。実際にはいいえ期待できるすべての標準動作echo
。
string
標準出力に書き込まれる文字列。最初のオペランドが
-n
ある場合、またはオペランドが次を含む場合\
<バックスラッシュ>人格、結果は実装によって定義されます。。存在するXSI規格に準拠システム内の最初のオペランドがある場合は、
-n
文字列として処理する必要があります。オプションではありません。すべての引数で、XSI互換システムでは、次の文字シーケンスが認識されます。
\a
-を書く<警告>。
\b
-を書く<バックスペースキー>。
\c
- 抑制<改行>それ以外の場合は、出力の最後の引数に従います。パラメーターの次の文字はすべて\c
無視されます。
\f
-を書く<ページ変更>。
\n
-を書く<改行>。
\r
-を書く<エンター>。
\t
-を書く<タブ>。
\v
-を書く<縦タップ>。
\\
-を書く<バックスラッシュ>特徴。
\0num
- 0、1、2、3桁の8進数の8ビット値を書き込みます。num
。
echo
したがって、一般的にそうすることに頼ることができない場合は、write newlineの使い方を知るための一般的な方法はありませんecho
。
シェルはbash
通常、次のことを行います。いいえ仕様、取り扱い、その他のオプションに準拠しています-n
が、それでも不確実です。あなたはできます:
shopt -s xpg_echo
echo hey\\nthere
hey
there
そしてそれでもなくビルドタイムオプションを使用してビルドした場合、bash
これは必要です...
デフォルトでは、拡張さ
echo
れたバックスラッシュエスケープ文字が組み込まれているため、この-e
オプションは必要ありません。これはデフォルト値を設定します。xpg_echo
住宅オプションon
これにより、Bash はecho
単一の Unix 仕様バージョン 3 で指定されたバージョンと同様に動作します。よりBash 組み込み機能、認識されたエスケープシーケンスの説明echo
。
printf
一方でprintf
の行動は比較的穏やかです。
この
printf
ユーティリティは、以前に提供されたサービスを提供するために追加されましたecho
。和解できない違い既存のバージョンのうち、このバージョンには、第9版システムの1つに基づくecho
この新しいユーティリティに残っているいくつかの特殊機能があります。printf
拡張された説明部分はほぼ正確に一致します。
printf()
ファイル形式表記法で説明されていますが、ISO C規格の機能XBDファイル形式表記。
%b
引数を記述する書式文字列を処理します。これは多くの場合がありますが、文字列の場合はyte文字列またはリテラル文字列とほぼ同じです%s
。%f
最初の引数の書式設定とは%b
別にエスケープを処理しないことを除いて、yte文字列引数と最もよく似ています\c
。
printf ^%b%s$ '\n' '\n' '\t' '\t'
^
\n$^ \t$
バラよりなぜprintf
より良いですかecho
?もっと学ぶ。
echo() printf
たとえば、独自の標準を作成できますecho
。
echo(){
printf '%b ' "$@\n\c"
}
...これは常に自動的に正しいタスクを実行する必要があります。
\n
実際、いいえ...最後の引数が奇数で終わると、引数の末尾にリテラルを印刷します。<バックスラッシュ>。
しかし、そうではありません:
echo()
case ${IFS- } in
(\ *) printf %b\\n "$*";;
(*) IFS=\ $IFS
printf %b\\n "$*"
IFS=${IFS#?}
esac
答え3
私が使用したすべてのバージョンのbashでは、文字列が完全に引用されている場合は、文字列に対話的に、またはスクリプトにリテラル改行文字を簡単に挿入できます。
インタラクティブ:
$ echo "Line one
> Line two"
Line one
Line two
$
スクリプトから:
echo "Line one
Line two"
答え4
人々は適切な答えを与えましたが、私はechoがecho以外のオプションを許可する世界を受け入れることを拒否します-n
。
nl='
'
echo Line 1"$nl"Line 2"$nl"Line 3