回答:
それがそのecho -nためです。
catますか?(たとえばsomething.txt、変数ではなくファイルがある場合$something)
printfは非常に柔軟で、より移植性がありechoます。C / Perl / etcの実装と同様に、フォーマット文字列を終了しない場合、\n改行は出力されません。
printf "%s" "$something" >> file.txt
コマンドの出力を使用している場合、xargsをechoと組み合わせて使用できます
/sbin/ip route|awk '/default/ { print $3 }' | xargs echo -n >> /etc/hosts
tr 別の選択肢です。
echo入力として使用している場合は、どちらを取得できますtr -d '\n'。
この手法は、他のコマンドからの出力をパイプするときにも機能します(1行の出力のみで)。さらに、ファイルにUNIXまたはDOSの行末文字があるかどうかわからない場合は、を使用できますtr -d '\n\r'。
これが機能することを示すいくつかのテストがあります。
改行が含まれます:
something='0123456789' ; echo ${something} | wc -c
11
UNIX改行:
something='0123456789' ; echo ${something} | tr -d '\n\r' | wc -c
10
DOSスタイル:
something='0123456789' ; echo ${something} | unix2dos | tr -d '\n\r' | wc -c
10
BSD trおよびGNUでテスト済みtr。
echo $something、その動作はIFS変数に依存し、文字が消えてしまう可能性があります。次を試すことができます:var="hello world"; echo $var(helloとworldの間に2つのスペース)またはvar="hello world"; IFS='l'; echo $varまたはvar="-e hello \\n world"; echo $var。これを解決するには、次のように変数を二重引用符で囲むecho "$var"か、を使用しますprintf。