我想创建一个带有传递给函数的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"