저는 Bash에서 일하고 있습니다. 나는 전달되는 내용에 관계없이 특정 변수의 길이가 항상 같은 16자 길이가 되도록 노력하고 있습니다.
나는 노력했다
t=33455
until [[ ${#t} == 16 ]]; do
t="${t} "
done
하지만 그것은 영원히 계속되는 것 같습니다. 공백은 문자로 처리되지 않는 것 같습니다.
변수의 길이가 항상 16자가 되도록 하는 방법이 있습니까?
편집: 중요한 맥락을 포함하는 것을 잊었습니다. 반영하도록 코드를 업데이트했습니다. 처음에 들어갈 변수는 모두 6자리를 넘지 않습니다. 위와 같이 하면 무한히 실행됩니다.
답변1
당면한 문제에 관해서는 Dickey가 궤도에 오른 것 같습니다.
대안으로 다음과 같은 것을 사용할 수 있습니다.
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