13

この質問に非常に似ています。

BASH で自動化されたスクリプトを使用して、いくつかのことを繰り返しています。時折、スクリプトが「-n」に遭遇し、echo がこれを解釈しようとします。

これを試みた:

 $ POSIXLY_CORRECT=1 /bin/echo -n

 $ POSIXLY_CORRECT=1 /bin/echo "-n"

 

しかし、それは毎回引数を解釈しました。

次に、これは機能しますが、文字列内のエスケープ文字にヒットする可能性があります。そのため、すべての入力に null 文字を適用して -e を使用したくありません。

$ echo -e "\x00-n"
-n

printf は可能ですが、他のオプションがない場合を除いて避けるべきです (すべてのマシンがユーティリティとして printf を持っているわけではありません)。

$ printf "%s" "-n"
-n

それで、「-n」を印刷するためにエコーを取得する方法はありますか?

4

6 に答える 6

9

printf一部のマシンに非常に古いシェルバージョンがない限り、すべてのシェルに組み込まれている必要があります。bash久しぶりのビルトインです。おそらく、よりも移植性がありecho -eます。

echoそうしないと、対象のオプションを取得する方法がまったくありません。

編集:別の同様の質問への回答から。printfこの便利なデジタル著作権保持なしのラッパーを使用して、引用の問題を回避します。

ech-o() { printf "%s\n" "$*"; }

(「オプションなし」のように、それはエコーです)

于 2012-11-06T20:24:06.037 に答える
4

文字列の前に、カットでオンザフライで削除される文字(たとえば、「x」)を付けるのはどうでしょうか。

echo "x-n" | cut -c 2-
于 2012-11-06T21:13:45.533 に答える
3

、という名前でBashを呼び出すと、オプションが使用できなかったshshを模倣します。それがあなたのニーズに合っているかどうかはわかりませんが。-necho

$ /bin/sh -c 'echo -n'
于 2012-11-06T20:28:23.353 に答える
3

echo "-n" はシェルに、文字ごとに echo の最初の引数として「-n」を入れるように指示します。意味的にecho "-n"は と同じecho -nです。代わりにこれを試してください (これは POSIX 標準であり、どのシェルでも動作するはずです):

printf '%s\n' "-n"
于 2012-11-06T21:19:45.463 に答える