编写测试代码。

编写测试代码。

我正在编写一个 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 中进行测试。

相关内容