変数に特定の数のスペースがあることを確認してください。

変数に特定の数のスペースがあることを確認してください。

私はBashで働いています。どの変数が渡されても、特定の変数の長さが常に同じ16文字の長さになるようにしようとしています。

頑張った

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

しかし、永遠に続くようです。スペースは文字と見なされないようです。

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

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

答え1

当面の問題に関しては、Dickeyがきちんと進んでいるようです。

あるいは、次のようなものを使用することもできます。

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

t常に16より短く、絶対に確信が必要な場合は、次のことができます。

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

関連情報