#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")"