KornShell Printf - Заполнение строки - PullRequest
2 голосов
/ 13 ноября 2009

Я пытаюсь написать функцию 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 ]

4 голосов
/ 14 ноября 2009

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

SOME_STRING=$(padSpaces TEST 10)

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

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

$ SOME_STRING=$(padSpaces TEST 10)
$ sq=\'
$ echo $sq$SOME_STRING$sq
'TEST '
$ echo "$sq$SOME_STRING$sq"
'TEST      '
2 голосов
/ 13 ноября 2009

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

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

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

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

Знак минус указывает printf выравнивание по левому краю (вместо выравнивания по умолчанию по правому краю). Поскольку manpage сообщает о команде printf format [ arg ... ],

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

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

...