【问题标题】:Parameter substitution in a string bash字符串bash中的参数替换
【发布时间】:2015-03-13 06:34:51
【问题描述】:

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

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

【问题讨论】:

    标签: string bash parameters substitution


    【解决方案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"
    

    【讨论】:

      【解决方案2】:

      由于参数无论如何都依赖于上下文,因此将这些抽象到您在全局变量中拥有消息字符串的地步并没有多大意义。无论哪个函数需要打印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"; }
      

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

      【讨论】:

        猜你喜欢
        • 2012-06-06
        • 1970-01-01
        • 1970-01-01
        • 2015-02-05
        • 1970-01-01
        • 1970-01-01
        • 2011-10-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多