Bash
printf 格式取決於參數的數量
我正在編寫一個帶有多個字元串的 bash 函式,每個字元串都列印為單獨的行。
但是必鬚根據傳遞給函式的字元串數量
frmt
來適當地組合變數。printf
print () { case $1 in h|-h|-\?|--help) printf "Prints a text string.\n" printf "\$1 TEXT Sentence to print.\n" local -r f=0 ;; *) local -r f=1 ;; esac local -r frmt="%s\n" printf $frmt "$@" }
有使用 函式參數的數量重複字元串的想法
printf
,但沒有成功local -r frmt=$(printf '%s\n' $(seq $#))
無需根據參數數量建構格式字元串。
引用Thompson 先生的連結:
- 根據需要重用格式參數來轉換所有給定的參數。例如,命令輸出.
‘printf %s a b’``‘ab’
編寫測試程式碼。
在處理這樣的事情時,盡可能多地分解它,在那裡建立一個形式。例如在你的情況下:
測試
#! /bin/bash - test1() { printf 'test1\n' printf 'ARG: "%s"\n' "$@" } test2() { printf 'test2\n' shift printf 'ARG: "%s"\n' "$@" } test3() { printf 'test3\n' printf '2-ARGS: "%s" "%s"\n' "$@" } test1 first a b "c d e" printf '\n' test2 first a b "c d e" printf '\n' test3 a b c d e
結果
test1 ARG: "first" ARG: "a" ARG: "b" ARG: "c d e" test2 ARG: "a" ARG: "b" ARG: "c d e" test3 2-ARGS: "a" "b" 2-ARGS: "c" "d" 2-ARGS: "e" ""
這應該給出一個想法
printf ‘%s\n’ $ (seq $ #)
local -r frmt=$(printf '%s\n' $(seq $#))
例如,這將導致:
printf '%s\n' $(seq 3) 1 2 3
與往常一樣:將您測試的內容分解為最低組件,在這裡:(
printf '%s\n' $(seq $#)
或真的seq $#
) - 並在 shell 中進行測試。