2015-03-13 91 views
0

在我的shell脚本中,我定义了几条需要记录为INFO,WARN或ERROR的消息。字符串bash中的参数替换

的消息如下:

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

我需要知道正确的语法,我怎么能做到这一点。

回答

1

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

下面是一个例子:

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

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

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

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

由于参数是上下文相关的,无论如何,它并没有真正多大意义,这些抽象到您在全局变量的消息字符串的地步。无论哪种功能需要打印BACKUP_INFO也需要知道字符串中的占位符,因此它可能直接包含字符串。如果你不想这样做,也许可以把它们变成功能。

print_info() { 
    local fmt 
    fmt=$1 
    shift 
    printf "$(date +'%F %T') ${SCRIPTNAME}: INFO: $fmt\n" "[email protected]" | 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"; } 

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