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

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

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

관련 정보