変数に一定数のスペースがあることを確認する

変数に一定数のスペースがあることを確認する

私は Bash で作業しています。渡される内容に関係なく、特定の変数を常に同じ長さ (16 文字) にしようとしています。

私は試した

t=33455
until [[ ${#t} == 16 ]]; do
t="${t} "
done

しかし、それは永遠に続くようです。スペースは文字として扱われていないようです。

変数を常に 16 文字の長さにする方法はありますか?

編集: 重要なコンテキストを含めるのを忘れていました。それを反映するためにコードを更新しました。最初に入力される変数はどれも 6 桁を超えません。上記を実行すると、無限に実行されます。

答え1

目下の問題については、ディッキーは正しい方向に進んでいると思います。

代替案としては、次のようなものを使用するとよいでしょう。

t="$(printf "%-16.16s" "$t")"

が常に 16 より短い場合t(これは完全に確実である必要がある)、次のように実行できます。

t="$(printf "%-16s" "$t")"

非 ASCII 文字ではクラッシュすることに注意してください。たとえば、次のテストを実行します。

$ x=123
$ x="$(printf "%-16.16s" "$x")"
$ printf "|%s|\n|1234567890123456|789012\n" "$x"
|123             |
|1234567890123456|789012

$ x=12345678901234567890123456
$ x="$(printf "%-16.16s" "$x")"
$ printf "|%s|\n|1234567890123456|789012\n" "$x"
|1234567890123456|
|1234567890123456|789012

$ x=sadasdæøåsasd
$ x="$(printf "%-16.16s" "$x")"
$ printf "|%s|\n|1234567890123456|789012\n" "$x"
|sadasdæøåsasd|                                     <<<--- ups!
|1234567890123456|789012

(またはもっと凝った言い方:

printf "\e[41m%s\e[0m\n\e[41m1234567890123456\e[0m789\n" "$x"

答え2

変数が長すぎる場合は、小さくなることはありません。私の場合は、次の方法でうまくいきます (文字列を切り捨てるか、パディングします)。

if [[ ${#t} -gt 16 ]]
then
    t="${t:0:16}"
else
    until [[ ${#t} -ge 16 ]]
    do
        t="${t} "
    done
fi

関連情報