在先前声明的变量中替换变量

Moh*_*mad 6 bash shell-script

这是需要根据 VAR2 更新的模板变量 VAR1,变量顺序如下所示如何在没有 sed 命令的情况下更新 VAR1

#!/bin/bash
VAR1="<tr>
    <th>\$VAR2</th>
  </tr>"
VAR2=test
echo $VAR2
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 5

你可以使用envsubst

(使用任何 POSIX shell,包括bash):

VAR1="<tr>
    <th>\$VAR2</th>
  </tr>"
VAR2=test

expanded_VAR1=$(
  export VAR2
  printf '%s\n' "$VAR1" |
    envsubst '$VAR2'
)
Run Code Online (Sandbox Code Playgroud)

或执行所有字扩展(参数扩展,命令替换,算术扩展)参数扩展,你可以使用zshe参数扩展标志:

#!/bin/zsh -
VAR1="<tr>
    <th>\$VAR2</th>
  </tr>"
VAR2=test

expanded_VAR1=${(e)VAR1}
Run Code Online (Sandbox Code Playgroud)

在 POSIX shell 中,您可以使用 aeval和 here-document执行类似的操作:

VAR1="<tr>
    <th>\$VAR2</th>
  </tr>"
VAR2=test

expanded_VAR1=$(eval "cat << EOF
$VAR1
EOF")
Run Code Online (Sandbox Code Playgroud)

使用bashor 的另一种选择zsh是使用printf

VAR1='<tr>
    <th>%s</th>
  </tr>'
VAR2=test

printf -v expanded_VAR1 -- "$VAR1" "$VAR2"
Run Code Online (Sandbox Code Playgroud)

使用zsh(但不是bash),您可以使用%n$s语法(如在许多printf(3)实现中一样)来引用nth参数:

#! /bin/zsh -
VAR1='<tr>
    <th>%1$s</th> <th>%1$s again</th> <th>%2$s</th>
  </tr>'
VAR2=test VAR3=test2

printf -v expanded_VAR1 -- "$VAR1" "$VAR2" "$VAR3"
Run Code Online (Sandbox Code Playgroud)

或者使用zformat任意命名你的格式指令(仅限于单字节字符,除了-, ., NUL 和十进制数字):

#! /bin/zsh -
VAR1='<tr>
    <th>%a</th> <th>%a again</th> <th>%b</th>
  </tr>'
VAR2=test VAR3=test2

zformat -f expanded_VAR1 "$VAR1" "a:$VAR2" "b:$VAR3"
Run Code Online (Sandbox Code Playgroud)

使用ksh93,您可以使用%H代替%sinprintf来正确编码 HTML 中的特殊字符(例如 for &to become &amp;),但对于非 ASCII 字符,它只能在使用 iso8859-1 字符集的语言环境中正常工作。ksh93'sprintf不支持-v,但您可以使用expanded_VAR1=${ printf... ;}.

随着printf/zformat办法,文字%模板中的字符可以被转义为%%(和\\\printf),并与e/ eval+这里-doc的临近,$/ `/\用前缀有S \。使用envsubst,AFAIK,$无法逃脱。


jes*_*e_b 3

您可以使用参数扩展将 var1 中的唯一字符串替换为 var2 的值:

var1='<tr>
    <th>unique_placeholder_var2</th>
  </tr>'
var2=test
echo "${var1/unique_placeholder_var2/"$var2"}"
Run Code Online (Sandbox Code Playgroud)