簡體   English   中英

bash:將格式信息傳遞給printf

[英]bash: passing format information into printf

我有一個帶有通用用法/錯誤函數的腳本,它會輸出錯誤,然后給出腳本用法信息。 為了討論這個例子,我把它減少了:

usage() {
  test -n "$1" && printf "\n %s" "$1" >&2
}

usage "Error:  text1 \ntext2 \ntext3"

這會產生輸出:

Error:  text1 \ntext2 \ntext3

我希望每組文本都在一個單獨的行上。 我怎么做?

您可以使用%b格式:

usage() { [[ $@ ]] && printf "%b\n" "$@"; }

並稱之為:

usage "Error:  text1 \ntext2 \ntext3"

輸出:

Error:  text1
text2
text3

根據help printf

%b  expand backslash escape sequences in the corresponding argument

您可以在創建作為參數傳遞的文字時使用$'...'語法處理轉義序列。

usage $'Error:  text1 \ntext2 \ntext3'

請參閱ANSI-C引用

只需刪除格式字符串:

usage() {
  [[ -n "$1" ]] && printf "$1" >&2
}

usage "Error:  text1 \ntext2 \ntext3"

目前尚不清楚,但如果你想要一個usage函數將每個參數放在自己的行上,你可以使用它:

$ usage() {
    printf %s\\n "$@" >&2
}
$ usage 'Error:  text1' text2 text3
Error:  text1
text2
text3

或者自己做循環並保持usage輸出空參數:

usage() {
    for arg; do
        printf %s\\n "$arg" >&2
    done
}

或者從anubhava的答案中借用一個技巧:

usage() {
    [[ "$@" ]] && printf %s\\n "$@" >&2
}

或沒有[[ bashism:

usage() {
    [ -n "$*" ]] && printf %s\\n "$@" >&2
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM