击。使用参数名称创建var并清除其值

时间:2016-06-07 22:19:38

标签: regex bash parameters

我想创建一个带有传递给函数的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语句中收到的数据,我们可以接收一些不同的字符串。我们来看看这三个例子:

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

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

1 个答案:

答案 0 :(得分:2)

这是一种方法:

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值,它们在创建后总是自动引用。

您可以使用namerefs来解决无法分配到变量的事实,即您无法做到:

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"

编辑2 - 带有eval的

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"