2009-11-13 109 views
1

我正在尝试编写一个KornShell(ksh)函数,它使用printf将字符串填充到特定宽度。KornShell 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制作固定宽度文件的方法。

回答

3

你的功能工作正常,我。您的作业不会在等号周围的空格处工作。它应该是:

SOME_STRING=$(padSpaces TEST 10) 

我冒昧地更换反引号。

你不显示你如何使用变量或如何获得你显示的输出。但是,您的问题可能是您需要引用您的变量。这里有一个演示:

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

@Dennis - +1,你能说出为什么空间被吃掉了吗? – 2009-11-15 01:10:40

+0

当'ksh'进行字段分割(又名'bash'中的单词分割)时,$ IFS中的字符序列在未加引号时被视为一个分隔符。试试这个:'string == $'a b \ t \ tc \ n \ nd'; echo $ string; echo“$ string”'。第一个'echo'会给你“a b c d”,第二个将有a,b和c展开,并且在下面两行。 '$ IFS'的默认值是'$'\ t \ n''。 – 2009-11-15 03:43:28

+0

在我以前的评论中,在字符串赋值中a和b之间应该有四个空格。在这种情况下,在他们的StackOverflow! – 2009-11-15 03:45:14

2

您是否知道您定义了一个名为padSpaces的函数,但仍然调用一个名为padString的函数?不管怎样,试试这个:

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

或者,更紧凑:

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

减号告诉printf到左对齐(而不是默认的右对齐)。作为关于命令printf format [ arg ... ]manpage状态,

的参数ARG根据与格式字符串格式相关联的 ANSI-C formatting rules被打印在标准输出。

(我刚安装ksh来测试该代码,它的工作原理在我的机器TM上。)

+0

这不适用于我的机器,给我0.000000s。 – 2009-11-13 17:47:35

+0

很奇怪。除非'$ 2'包含一些非数字字符(在你的例子中它没有),否则我看不到'printf'可以将参数格式化为float而不是字符串...... – Stephan202 2009-11-13 17:56:09

+0

我想通了,错过了一些报价,但仍然有问题,请参阅上文。 – 2009-11-13 18:28:13