2009-11-13 111 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