Bash

printf 格式取決於參數的數量

  • July 6, 2021

我正在編寫一個帶有多個字元串的 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 中進行測試。

引用自:https://unix.stackexchange.com/questions/657140