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