bash echoで「-E」を印刷する方法は?

bash echoで「-E」を印刷する方法は?

echoを実行し、次のような出力を取得したいと思います。

$ export EVAR="-E"
$ echo "$EVAR"
-E

たとえば、bash変数に「-E」を保存しました$EVAR。 echoを実行すると、echo $EVAR何も印刷されません。おそらく、$EVARが-Eパラメータであると思うかもしれません。二重引用符で引用することも$EVAR機能しません。

どのように印刷できますか?

ノート$EVAR:$EVARの内容を理解できず、$EVARの内容を分析しない解決策があるかもしれないと思いましたecho some-arg $EVAR。可能ですか?または、このような回避策を使用する必要がありますかprintf

答え1

次のトリックを使用できます。

echo " $EVAR"
echo  -e "\055E"
echo $'\055E'

しかし、私が言ったように、これはトリックです。実際の解決策は常にprintfを使用することです。

$ printf '%s\n' "$EVAR"
-E

答え2

要求どおりに出力の前に空白行があっても問題ない場合は、コマンドラインでこのソリューションを直接テストしてください。

$ export EVAR="-E"
$ echo -e "\n$EVAR"

-E
  • オリジナルはecho "$EVAR"何も提供しません。なぜなら、疑いのとおり、コマンド-Eに対して許可されたオプションと見なされるからですecho。 ..man echoは次のように言います。 -E disable interpretation of backslash escapes (default)
  • したがって、空白文字を先頭に追加します。この場合、新しい行
  • ただし、直接使用することはできません。解釈を"\n"使用してください。-e"\n"
  • もちろん、これは、元のコンテンツがまだ残っている場合は、$EVAR出力で最初に紹介した空白行を削除するために別の操作を実行する必要があることを意味します。

答え3

printf前述のように使用するか、shopt xpg_echoそれを有効にすると閉鎖標準までecho

echo 'hi\nthere'

hi
there

-Eただし、まだパラメータを正しく処理できません。したがって、次のように独自の小さなコンプライアンス標準を作成できますecho

echo()
    case  ${IFS- }  in
    (\ *) printf %b\\n "$*";;
    (*)   IFS=\ $IFS
          printf %b\\n "$*"
          IFS=${IFS#?}
    esac

...後で来ます。最大echoあらゆる点で単一のUnix仕様に準拠しています。(aまた、8進数をbash printf処理する際に標準に違反することを除いて)\[num]{1,3}%b

...だから...

echo -E

-E

答え4

printf代わりに使用できますecho

$ EVAR="-E"
$ printf "%s\n" ${EVAR}
-E

関連情報