回答:
それがその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
。