Как написать функцию с переменным числом аргументов, которые передаются в printf

#bash #printf #variadic-functions

Вопрос:

Как исправить print_error функцию ниже:

 #!/bin/bash  script_name="tmp.bash"  function print_error {  format="$1"  shift  printf "%s: ERROR: %sn" "$script_name" "$format" "$@" }  print_error "Today is %s; tomorrow is %s" "$(date)" "$(date -d " 1 day")"  

так что он выводит:

 tmp.bash: ERROR: Today is Mon Nov 22 15:10:40 PST 2021; tomorrow is Tue Nov 23 15:10:50 PST 2021  

В настоящее время он выводит:

 tmp.bash: ERROR: Today is %s; tomorrow is %s Mon Nov 22 15:10:40 PST 2021: ERROR: Tue Nov 23 15:10:50 PST 2021  

print_error должен уметь принимать переменное количество аргументов.

Ответ №1:

Используйте промежуточную переменную (здесь substr ) для создания функционального сообщения (сообщение о дате) и второго идентификатора для технического сообщения (сообщение об ошибке).:

 #! /bin/bash  declare -r script_name="tmp.bash"  function print_error {  local substr=  printf -v substr "$1" "${@:2}"  printf "%s: ERROR: %sn" "$script_name" "$substr" }  print_error "Today is %s; tomorrow is %s" "$(date)" "$(date -d " 1 day")"  

Чем, вы можете разделить функциональные и технические сборки:

 #! /bin/bash  declare -r script_name="tmp.bash"  function print_tech_error () {  printf "%s: ERROR: %sn" "$script_name" "$1" } function print_fct_error {  local substr=  printf -v substr "$1" "${@:2}"  print_tech_error "${substr}" }  print_fct_error "Today is %s; tomorrow is %s" "$(date)" "$(date -d " 1 day")"