如何将脚本变量插入正则表达式字符串?

use*_*413 3 shell

我正在编写一个脚本,试图将目录名称插入到 pax 命令中,但我不确定如何使语法正确。这就是我正在尝试的,但它似乎将 $DIRNAME 视为正则表达式字符串的一部分。

DIRNAME=$(tar -tvf $1  | head -1 | sed -e 's:^.* \([^/]*\)/.*$:\1:')
pax -r -f $1 -s'/$DIRNAME\/upload\///'
Run Code Online (Sandbox Code Playgroud)

谢谢!

Edw*_*per 5

在调用 pax 时尝试使用双引号而不是单引号:

DIRNAME=$(tar -tvf $1  | head -1 | sed -e 's:^.* \([^/]*\)/.*$:\1:')
pax -r -f $1 -s"/$DIRNAME\/upload\///"
Run Code Online (Sandbox Code Playgroud)

在一些 shell(例如 bash 和 sh)中,$variables 仅在出现在双引号字符串中时才会被扩展,而不是单引号字符串。


例如,以下脚本:

#!/bin/sh

DIRNAME=$(echo 'hello')
echo "Single quotes around regexp:"
echo 'hello world' | sed 's/$DIRNAME/hi/'

echo "Double quotes around regexp:"
echo 'hello world' | sed "s/$DIRNAME/hi/"
Run Code Online (Sandbox Code Playgroud)

生成输出:

Single quotes around regexp:
hello world
Double quotes around regexp:
hi world
Run Code Online (Sandbox Code Playgroud)