Ich arbeite in Bash. Ich versuche, eine bestimmte Variable so einzustellen, dass sie immer die gleiche Länge von 16 Zeichen hat, unabhängig davon, was in sie eingegeben wird.
Ich habe es versucht
t=33455
until [[ ${#t} == 16 ]]; do
t="${t} "
done
aber es scheint ewig zu laufen. Es scheint, als würden die Leerzeichen nicht als Zeichen behandelt.
Gibt es eine Möglichkeit, die Variable immer 16 Zeichen lang zu machen?
EDIT: Ich habe vergessen, einen wichtigen Kontext hinzuzufügen. Ich habe den Code entsprechend aktualisiert. Keine der Variablen, die eingegeben werden, ist anfangs länger als 6 Ziffern. Wenn ich das oben genannte mache, läuft es unendlich.
Antwort1
Was das vorliegende Problem betrifft, denke ich, dass Dickey der Sache auf der Spur ist.
Verwenden Sie als Alternative vielleicht etwas wie:
t="$(printf "%-16.16s" "$t")"
Wenn t
immer kürzer als 16 ist (worüber Sie sich ganz sicher sein müssen), können Sie Folgendes tun:
t="$(printf "%-16s" "$t")"
Beachten Sie, dass es bei Nicht-ASCII-Zeichen abstürzt. Testen Sie beispielsweise:
$ 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
(Oder etwas ausgefallener:
printf "\e[41m%s\e[0m\n\e[41m1234567890123456\e[0m789\n" "$x"
)
Antwort2
Wenn Ihre Variable zu lang war, wird sie nie kleiner. Das hier funktioniert bei mir (den String kürzen oder auffüllen):
if [[ ${#t} -gt 16 ]]
then
t="${t:0:16}"
else
until [[ ${#t} -ge 16 ]]
do
t="${t} "
done
fi