我想创建一个带有传递给函数的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完成?提前谢谢。
答案 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"