2016-09-25 69 views
0

在我的bash腳本中,我包含了該程序所需的其他文件的數組。然後我在幫助說明中打印這些內容。當我使用printf輸出時,我得到了我沒有想到的結果。我已經讀過,$ {array [@]}形式通常是首選的擴展名默認,所以我從這開始。

我的數組聲明:

scriptDependencies=("script1.sh" "script2.sh") 

而且(初始)printf命令:

printf "Dependencies: %s\n" "${scriptDependencies[@]}" 

我有什麼作爲輸出:

Dependencies: script1.sh 
Dependencies: script2.sh 

雖然我相信我明白一個基本下標'@'和'*'之間的區別是所有單個元素與所有元素組合在一起,我不是期待打印兩條單獨的線。

當我切換printf命令使用$ {scriptDependencies [*]}形式,單個線(接近我需要的話)被印:

Dependencies: script1.sh script2.sh 

是printf的這一預期的行爲,並的下標?還是它指向printf的問題?

我正在使用GNU bash,版本3.2.57(1)-release(x86_64-apple-darwin15)。

+0

如果您想以明確的形式打印數組的內容,請考慮:'printf'Dependencies:'; printf'%q'「$ {scriptDependencies [@]}」; printf'\ n'' - 寫的更多,但它意味着'array =(「foo bar」)'和'array =(foo bar)'每個都有不同的輸出 - 並且'array =($' foo \ nbar')'同樣會得到理智的處理。 –

+0

如果你不關心格式化控制,你也可以使用'declare -p scriptDependencies' –

+0

也許我應該把這個聊天?我不是(迄今)能夠圍繞你的任何評論包裹我的小腦袋,但我已經測試了兩者。對於%q格式,我在依賴項數組中包含的一個字符串包含「(v2)」。當我使用%q時,空格和對角線都添加了escape seq。我不明白是什麼使得這些毫不含糊? declare -p scriptDependencies的輸出結果如下:declare -a scriptDependencies ='([0] =「script1.sh」[1] =「script2.sh」)'我得到你提到這些是因爲有善良,但我不明白。這麼多的時間來學習,這麼短的時間:) –

回答

6

這是記錄和預期的行爲。如果傳遞給printf的字符串數多於格式字符串可以處理的字符串數,那麼將重複該格式字符串。

"${array[@]}"擴展爲每個數組元素的shell字。因此,對於具有兩個元素的數組,將傳遞printf的兩個參數;如果格式字符串只有一個佔位符(只有一個%s),那麼它將被重複。

相比之下,"${array[*]}"(帶引號!)將擴展爲只有一個參數(第一個字符IFS,默認情況下,在每個元素之間插入一個空格)。


擊要求通過POSIX specification做到這一點,加入以下重點:

  • 格式操作數應當被重用盡可能經常需要滿足參數操作數。任何額外的c或s轉換說明符應被評估,就像提供了空字符串參數一樣;應評估其他額外的轉換規格,就像提供零參數一樣。如果格式操作數不包含轉換規範,並且參數存在操作數,則結果未指定。
  • 因此,此行爲適用於所有符合POSIX標準的外殼。

    2

    這是預期的:從help printf

    格式重新根據需要使用以消耗所有的參數。如果 的參數比格式要求的參數更少,則額外格式 規範的行爲就像提供了零值或空字符串(如果適當),即 已提供。

    +0

    非常酷。在我的系統中,printf沒有描述這一點,但手冊頁說基本上是一樣的。但是,我不確定如果沒有親身體驗過這種行爲,我會理解那是什麼意思。現在我正在查看選項,以在單行依賴關係之後在單行中打印每個依賴項,而不用單行輸入。 –

    相關問題