確保變數具有一定的空格數

確保變數具有一定的空格數

我在 Bash 工作。我試圖讓一個特定的變數始終具有相同的長度,16 個字元長,無論傳遞給它的是什麼。

我試過

t=33455
until [[ ${#t} == 16 ]]; do
t="${t} "
done

但它似乎會永遠運行。看來空格不被視為字元。

有沒有辦法讓變數始終為 16 個字元長?

編輯:我忘記包含一些重要的上下文。我更新了程式碼以反映。最初輸入的變數都不超過 6 位數字。當我執行上述操作時,它會無限運行。

答案1

至於眼前的問題,我猜迪基已經步入正軌。

至於替代方案,也許可以使用類似的東西:

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

相關內容