我正在编写一个 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 $#))
答案1
无需根据参数数量构建格式字符串。
去引用链接汤普森先生:
- 这格式论据是必要时重复使用转换所有给定的参数。例如,该命令
‘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 中进行测试。