![](/img/trans.png)
[英]Environment variable passed to bash script is empty inside function
[英]Name of variable passed to function in bash
bash 中有没有办法理解传递给它的变量的名称?
例子:
var1=file1.txt
err_var=errorfile.txt
function func1 {
echo "func1: name of the variable is: " $1
echo "func1: value of variable is: " $1
echo
if [ ! -e $var1 ]
then
$1 = $err_val #is this even possible?
fi
func2 $1
}
function func2 {
echo "func2: name of the variable is: " $1
echo "func2: value of variable is: " $1
echo
}
func1 $var1
func1 $err_var
如果 file1.txt 存在,我希望得到以下输出:
func1: name of the variable is: var1
func1: value of variable is: file1.txt
func2: name of the variable is: var1
func2: value of variable is: file1.txt
当 file1.txt 不存在时:
func1: name of the variable is: var1
func1: value of variable is: file1.txt
func2: name of the variable is: err_var
func2: value of variable is: errorfile.txt
有任何想法吗?
不,变量在函数看到它之前被扩展。 该函数只看到值,而不是变量名。
如果传递未扩展且没有美元符号的变量名,则可以使用间接。
get_it () {
echo "${!1}"
}
演示:
$ foo=bar
$ baz=qux
$ get_it foo
bar
$ get_it baz
qux
就像丹尼斯说的那样,一旦你使用美元符号扩展了变量,你的函数就不再有办法获取变量名了。 但是我认为您还询问了一种设置变量值的方法,而该部分尚未得到解答。 有一些不可移植的方法可以做到这一点,例如declare -n
(如果您感兴趣,请使用 Google),但我的答案将坚持通用解决方案。
我是一名C++
程序员,所以我喜欢模仿“ getter 和 setter ”的哲学,在那里你使用微小的函数来获取和设置变量的值。 使用 getter 和 setter 的缺点是您需要为每个要管理的值创建一个函数(或两个函数)。 所以......我做了一个“工厂函数”来为你创建 getter/setter:
makeGetSet() {
. /dev/fd/0 <<END_FUNC
${1}Val() { [ "\${1}" ] && ${1}="\${1}" || echo "\${${1}}"; }
END_FUNC
}
它不需要任何具有特殊功能的特定 shell,如间接或namerefs
或declare
实用程序。 没有eval
,没有alias
,只有 100% POSIX。 您只需将变量名称传递给makeGetSet
,并且您的 getter/setter 函数具有相同的名称,末尾带有“ Val
”(例如myVariableVal
)。 用bash
和dash
测试。 您可以继续使用“普通”shell 方式结合我的函数来读/写变量。
用法:
Setup: makeGetSet myVariable
Set: myVariableVal newValue
Get: anotherVariable="`myVariableVal`"
Print: myVariableVal
我不确定你脚本的几个部分,所以我做了一些有根据的猜测。 if [ ! -e $var1 ]
if [ ! -e $var1 ]
,我想你的意思是if [ ! -e $1 ]
if [ ! -e $1 ]
。 最后,在你调用函数的地方,你有func1 $var1
和func1 $err_var
,但我认为你打算只使用func1 $var1
或有第三个变量。 看起来$err_var
是“错误的默认值”,而不是您作为输入提供的内容,但也许我没有遵循您的想法。
所以我对你的问题的回答如下:
var1=file1.txt; makeGetSet var1
err_var=errorfile.txt; makeGetSet err_var
function func1 {
echo "func1: name of the variable is: " ${1%Val}
echo "func1: value of variable is: " `${1}`
echo
# Shorter than if..fi
[ ! -e `${1}` ] && ${1} ${err_val}
func2 ${1}
}
function func2 {
echo "func2: name of the variable is: " ${1%Val}
echo "func2: value of variable is: " `${1}`
echo
}
func1 ${var1}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.