这是需要根据 VAR2 更新的模板变量 VAR1,变量顺序如下所示如何在没有 sed 命令的情况下更新 VAR1
#!/bin/bash
VAR1="<tr>
<th>\$VAR2</th>
</tr>"
VAR2=test
echo $VAR2
Run Code Online (Sandbox Code Playgroud)
你可以使用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)
或执行所有字扩展(参数扩展,命令替换,算术扩展)在参数扩展,你可以使用zsh其e参数扩展标志:
#!/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 &),但对于非 ASCII 字符,它只能在使用 iso8859-1 字符集的语言环境中正常工作。ksh93'sprintf不支持-v,但您可以使用expanded_VAR1=${ printf... ;}.
随着printf/zformat办法,文字%模板中的字符可以被转义为%%(和\如\\在printf),并与e/ eval+这里-doc的临近,$/ `/\用前缀有S \。使用envsubst,AFAIK,$无法逃脱。
您可以使用参数扩展将 var1 中的唯一字符串替换为 var2 的值:
var1='<tr>
<th>unique_placeholder_var2</th>
</tr>'
var2=test
echo "${var1/unique_placeholder_var2/"$var2"}"
Run Code Online (Sandbox Code Playgroud)