字符串中的参数替换 bash

Parameter substitution in a string bash

在我的 shell 脚本中,我定义了一些需要记录为 INFO、WARN 或 ERROR 的消息。

留言如下:

###### This may not be correct syntax as I need to know this #######
BACKUP_INFO="File {} is compressed at path {}."
ERROR_FILE_NOT_EXIST="File {} doesn\'t exist."
OTHER_ERROR="Cannot backup File {}, Reason: {}"

我有一种方法可以将此信息记录在文件中:

function print_info() {
  echo -e "$(date +'%F %T') ${SCRIPTNAME}: INFO: ${*}" | tee -a ${LOGFILE};
}

现在我需要将我的消息传递给打印信息方法,第一个参数应该放在第一个{},第二个参数应该放在第二个{},依此类推。

我什至试图将我的消息声明为

BACKUP_INFO="File $FILE_NAME is compressed at path $BACKUP_DIR."

但问题是变量 FILE_NAME 和 BACKUP_DIR 在方法内部,消息是全局定义的。

有点想用如下图:

print_info $BACKUP_INFO $FILE_NAME $FILE_PATH

所以输出应该是

2015-03-13 07:05:05 : INFO: File /opt/mgtservices/relay.log is compressed at path /root/backup

我需要知道如何实现这一点的正确语法。

您可以使用 printf 作为占位符,使用“%s”。

这是一个例子:

SCRIPT_NAME="foo.sh"
FORMAT="hello %s, %s"

print_info() {
  format=""
  shift
  printf "$(date +%F) $SCRIPT_NAME: $format\n" "$@"
}

name="bob"
message="how are you?"

print_info "$FORMAT" "$name" "$message"

由于参数无论如何都依赖于上下文,因此将这些参数抽象到全局变量中具有消息字符串的位置并没有多大意义。无论哪个函数需要打印 BACKUP_INFO 也需要知道字符串中有哪些占位符,因此它还不如直接包含字符串。如果你不想这样,也可以将它们更改为函数。

print_info () {
    local fmt
    fmt=
    shift
    printf "$(date +'%F %T') ${SCRIPTNAME}: INFO: $fmt\n" "$@" | tee -a "$LOGFILE"
}

backup_info () { print_info 'File %s is compressed at path %s.' "" ""; }
error_file_not_exist () { print_info "File %s doesn't exist." ""; }
# XXX FIXME: "other_error" is really a misnomer!
other_error () { print_info 'Cannot backup File %s, Reason: %s' "" ""; }

有点巧合的是,如果您想为您的脚本提供本地化支持,这实际上也可能提供一些好处;那么如果英语字符串的词序对于目标语言来说是错误的,翻译人员可以用不同的格式覆盖英语格式化功能。