私は "Header"というメッセージにこの行を挿入しました。
header="
-------------------------------------
Name\tAge\tGender\tAddress
-------------------------------------
"
残念ながら、\t
期待どおりに動作しませんでした。私は\t
その間どこかに置こうとします``
。
$header
それから自動電子メールに入れました。
mailx -s "$subject" -r "$from" "$to" <<-eof
$header
$body
$footer
eof
}
答え1
ANSI文字列を使用する場合:
header=$'
-------------------------------------
Name\tAge\tGender\tAddress
-------------------------------------
'
変数のすべてのANSIエスケープ文字を正しく翻訳しました。 (注:改行文字も定義できますが、\n
ケースの読みやすさは高くなりませんので、この回答で説明されているように元の形式をそのまま残します。)
使用されているすべての場所で他のツールを使用して変換することもできます(文字列にはまだテキスト表現が含まれています)。たとえば、使用するecho -e
(あなたのバージョンがそのecho
オプションをサポートしている場合)、または変数を次のように使用します書式文字列ここでは、printf
次のエスケープ文字も解釈されますprintf "$header"
。
ディスカッション:使用はprintf
POSIX標準になるという利点があります。 ANSI文字列を使用すると、変換が常に変数に存在し、追加の説明が必要ないという利点があります。
(更新された質問からわかるように)変数はmailx
エスケープ文字を解釈しないプログラム()のコンテキストで使用されるため、変数にはすでに適切な型が含まれている必要があります。ANSI文字列(ksh93
AIXの場合)が適切なソリューションのようです。標準に準拠したソリューションでは、再割り当て変数を使用することもできますprintf
。たとえば、次のようになります。header="..." ; header=$( printf "$header" )
答え2
次のようにタイトルに改行文字を追加します\n
。
header="---------------\n名前\t年齢\t性別\ tアドレス\n------------------ -----\n"
次に、次のようにecho -e $header
表示します。
echo -e $header
-------------------------------------
Name Age Gender Address
-------------------------------------
それでも機能しない場合は、echo -e
代わりに使用してくださいprintf
。出力がダッシュで始まる場合、printf -- "$header"
呼び出しはprintf
変数全体を引数として解析するのではなく、出力として解釈するように指示します。
もっとテストした後、元の変数はprintfでも動作します。
header="
-------------------------------------
Name\tAge\tGender\tAddress
-------------------------------------
"
printf -- "$header"
-------------------------------------
Name Age Gender Address
-------------------------------------
これを使用するには、mailx
次のものを使用できます。
mailx -s "$subject" -r "$from" "$to" <<eof
$header
$body
$footer
eof
答え3
もう一つの可能なオプションは awk を使うことです。
$ echo "Name Age Gender Address" | awk -F' ' '{ printf "%s\t%s\t%s\t%s\n", $1, $2, $3, $4 }'
生産する:
Name Age Gender Address
またはprintfを直接使用してください。
$ printf "%s\t%s\t%s\t%s\t\n" Name Age Gender Address
生産する:
Name Age Gender Address
答え4
~からman echo
通常、(ダブルハイフン)を使用して、ハイフンで始まる文字列とフラグを区別できます。 echoコマンドはフラグをサポートしていないため、文字通り処理されます(デュアルハイフン)。
2番目の例では、次のようになります。
注:メッセージにエスケープシーケンスが含まれている場合は、引用符で囲む必要があります。それ以外の場合、シェルは\(バックスラッシュ)をメタ文字として解釈し、\を異なる方法で処理します。
実際、AIXでは次のようになります。
~> header="
-------------------------------------
Name\tAge\tGender\tAddress
-------------------------------------
"
~> echo -e $header
-e ------------------------------------- Name Age Gender Address -------------------------------------
~> echo "$header"
-------------------------------------
Name Age Gender Address
-------------------------------------