正则表达式 – Bash.使用参数名称创建var并清除其值

我想创建一个带有传递给函数的param名称的var.有可能吗?然后过滤它的内容,以便在读取数据时之前和之后删除可能的空格和单引号.不工作的例子:

function test() {
    read $1
    [[ ${1} =~ ^\'?(.*)(\'.*)?$]] && 1="${BASH_REMATCH[1]}"
}

test "testingvar"
#At this point, the user sent some data to the read statement
echo $testingvar

对于read语句中收到的数据,我们可以接收一些不同的字符串.我们来看看这3个例子:

/path/file
'/path/file'
/path/file' <-notice a space after the quote

在所有的例子中,正则表达式必须清除并让/ path / file没有可能的引号和空格….正如我所说,所有在var中都被称为函数的参数.是梦还是可以用bash完成?提前致谢.

最佳答案 这是一种方法:

fun(){
    read -r "$1"
    declare -n var="$1" #use a nameref -- see `help declare`
    var=${var//[\' ]/}  #clean the contents with string substitution
}
fun testingvar <<<"/path/file"; echo "$testingvar"
fun testingvar <<<"'/path/file'"; echo "$testingvar"
fun testingvar <<<"  /path/ file'"; echo "$testingvar"

这输出:

/path/file
/path/file
/path/file

即,所有输入都被清理并放入其名称通过$1传递的变量中.

Namerefs:

基本上,namerefs就像自动解引用指针,除了它们指向变量而不是地址.它们既可以用作l值,也可以用作r值,它们在创建后始终自动引用.

您可以使用nameref来解决无法分配给变量变量的事实,即您无法执行以下操作:

foo=bar

然后

$foo=42 #illegal

将42分配给bar,但你可以这样做:

declare -n foo=bar
foo=42 #now bar is 42

编辑:
如果要删除所有单引号和空格但仅在开头和结尾,可以使用extglob:

fun(){
    local settings="$(shopt -p extglob)" #save extglob settings
    shopt -s extglob #set extglob
    read -r "$1"
    declare -n var="$1" #use a nameref -- see `help declare`
    var=${var##+([ \'])}; var=${var%%+([ \'])}
    eval "$settings" #restore extglob settings
}
fun testingvar <<<"/path/file"; echo "$testingvar"
fun testingvar <<<"'/path/file'"; echo "$testingvar"
fun testingvar <<<"  /pa'th/ f'ile'"; echo "$testingvar"

使用eval编辑2 – nameref-less版本:

fun(){
    local settings="$(shopt -p extglob)" #save extglob settings
    shopt -s extglob #set extglob

    local var
    read -r var; var=${var##+([ \'])}; var=${var%%+([ \'])}
    eval "$1=\$var" #avoids interpolating the var value for eval to avoid code injections via stdin

    eval "$settings" #restore extglob settings
}
fun testingvar <<<"/path/file"; echo "$testingvar"
fun testingvar <<<"'/path/file'"; echo "$testingvar"
fun testingvar <<<"  /pa'th/ f'ile'"; echo "$testingvar"
点赞