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