HOWTO · Bash

Bashスクリプトでタブ文字をエコー

この記事では、タブなどの特殊文字をエコーする方法を示します。そうしないと、Bash スクリプトで単一のスペース文字に変換されてしまいます。 これは、Bash 以外のシェル(zsh など) にも拡張されます。

このページの内容

この記事では、Bash スクリプトを使用するときに 1つまたは複数の tab 文字を echo する方法について説明します。

Bashスクリプトでタブ文字をエコー

echo コマンドは単純です: ターミナルに渡されたものを表示します。 通常、変数を次のように保存すると:

example='         'testing

コマンド echo '['$example']' を使用してこの変数を出力しようとすると、次の出力が得られます。

[ testing]

これは、変数に入力または保存したものではありません。 上記の例では、tab 文字を 2 回使用しましたが、表示されるのは 1つのスペースだけです。

この動作は、すべてのシェルで一貫しているわけではないことに注意してください。 たとえば、zsh シェルで同じスクリプトを実行すると、次の出力が得られると予想されます。

[               testing]

Bash スクリプトに戻ると、これを回避する方法がいくつかあります。

-e フラグを使用する

-e フラグは バックスラッシュ エスケープの解釈を有効にする を意味します。 上記と同じ例を書くとしたら、次のように書きます。

example='\t\t'testing
echo -e '['$example']'

出力は次のとおりです。

[               testing]

\t の部分はタブを表しています。 したがって、2つのタブを導入したかったので、\t\t と記述しました。

-e フラグが渡されると、\t 記号はタブとして解釈され、必要に応じて表示されます。

次の場合のように -e フラグが使用されていない場合、\t はリテラル文字列として読み取られ、タブとして処理されません。

example='\t\t'testing
echo '['$example']'

出力は次のとおりです。

[\t\ttesting]

フラグを渡すことは POSIX ではないことに注意してください。 したがって、フラグが実装されていない make のように、これを移植して使用することはできません。 したがって、ほぼ普遍的な printf を含むいくつかの代替案について説明します。

もちろん、この部分は私たちが始めたものから少し外れています。なぜなら、私たちは echo を完全に放棄するからです.

二重引用符を使用する

これは間違いなく最も単純なソリューションであり、構文以外の説明は必要ありません。 コマンドは次のように記述します。

example='       'testing
echo "[$example]"

結果は次のようになります。

[       testing]

代わりに printf を使用してください

これは、3つのソリューションの中で最も移植性が高く、最も推奨されます。 echo には多くの実装とバージョンがありますが、printf はほとんど同じです。

どこで個別に実装されていても、非常によく似た実装です。 上記のメソッドのバリエーションは、zsh を使用して呼び出された場合は同じ出力になりますが、bash を使用して呼び出された場合は異なるため、これを見ることができます。

printf を使用するための構文を以下に定義します。

example='       'x
printf '%s\n' "[$example]"

出力は次のとおりです。

[       x]

一般的な推奨事項として、必要な出力が hello のような単純なテキストである限り、echo は正常に機能しますが、複雑なものでは、echo を使用すると、シェル間で動作が大きく異なる可能性があるため、扱いにくい場合があります。 そのようなすべての場合 (特殊文字など) では、代わりに printf を使用することをお勧めします。