KornShell Printf - Заполнение строки

Я пытаюсь написать функцию KornShell (ksh), которая использует printf для заполнения строки до определенной ширины.

Примеры:

Вызов

padSpaces Hello 10

Выход

'Hello     '

В настоящее время у меня есть:

padSpaces(){
        WIDTH=$2
        FORMAT="%-${WIDTH}.${WIDTH}s"
        printf $FORMAT $1
}

Изменить: Это, кажется, работает само по себе, но когда я назначаю это в сценарии, кажется, теряет все, кроме первого пробела.

TEXT=`padSpaces "TEST" 10`
TEXT="${TEXT}A"
echo ${TEXT}

Выход:

TEST A

Я также открыт для предложений, которые не используют printf. На самом деле я пытаюсь получить файл фиксированной ширины из ksh.

2 ответа

Решение

Ваша функция работает нормально для меня. Ваше задание не будет работать с пробелами вокруг знака равенства. Так должно быть:

SOME_STRING=$(padSpaces TEST 10)

Я взял на себя смелость заменить тылы тоже.

Вы не показываете, как вы используете переменную или как вы получили результат, который вы показали. Однако ваша проблема может заключаться в том, что вам нужно заключать в кавычки свои переменные. Вот демонстрация:

$ SOME_STRING=$(padSpaces TEST 10)
$ sq=\'
$ echo $sq$SOME_STRING$sq
'TEST '
$ echo "$sq$SOME_STRING$sq"
'TEST      '

Знаете ли вы, что вы определяете функцию под названием padSpacesеще позвони по имени padString? В любом случае, попробуйте это:

padString() {
    WIDTH=$2
    FORMAT="%-${WIDTH}s"
    printf $FORMAT $1
}

Или более компактный:

padString() {
    printf "%-${2}s" $1
}

Знак минус говорит printf выравнивание по левому краю (вместо выравнивания по умолчанию по правому краю). Как говорится на странице руководства о команде printf format [ arg ... ],

Аргументы arg выводятся на стандартный вывод в соответствии с правилами форматирования ANSI-C, связанными с форматом строки формата.

(Я только что установил ksh проверить этот код; работает на моей машинеТМ.)

Другие вопросы по тегам