字符串bash中的参数替换

时间:2015-03-13 06:34:52

标签: string bash parameters substitution

在我的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

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

2 个答案:

答案 0 :(得分:1)

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

以下是一个例子:

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

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

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

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

答案 1 :(得分:1)

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

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

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

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