下面是做这件事:
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 - nameref少用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"
[壳牌参数扩展(https://www.gnu.org/software/bash/manual/bash.html#Shell-Parameter-Expansion)和'$ {!名}'可能是什么你在追求。请注意,在'read'中,通常你会指定没有'$'的名字(例如'read -r value'),因为你想读入变量,而不是读入它的当前值。 –
'test'对于shell函数来说是一个可怕的名字......'test'已经是大多数现代shell中的内置shell。 – twalberg
是的,你是对的。但在我的真实剧本中,它有另一个名字。谢谢你的提示。 – OscarAkaElvis