変数のタブが機能しない

変数のタブが機能しない

私は "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"

ディスカッション:使用はprintfPOSIX標準になるという利点があります。 ANSI文字列を使用すると、変換が常に変数に存在し、追加の説明が必要ないという利点があります。

(更新された質問からわかるように)変数はmailxエスケープ文字を解釈しないプログラム()のコンテキストで使用されるため、変数にはすでに適切な型が含まれている必要があります。ANSI文字列ksh93AIXの場合)が適切なソリューションのようです。標準に準拠したソリューションでは、再割り当て変数を使用することもできます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
-------------------------------------

関連情報