변수에 특정 수의 공백이 있는지 확인하십시오.

변수에 특정 수의 공백이 있는지 확인하십시오.

저는 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

관련 정보