echoを使用するときに新しい行を追加する方法

echoを使用するときに新しい行を追加する方法

次のコマンドが生成されたファイルに新しい行を挿入しないのはなぜですか。回避策は何ですか?

$ 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これは必要です...

--enable-xpg-echo-default

デフォルトでは、拡張さ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

関連情報