我想为bash定义一个变量,该变量将在每次使用时进行评估。
我的目标是定义两个变量:
A=/home/userA
B=$A/my_file
因此,每当我更新A
时,B
就会被更新为A
的新值。
我知道如何在提示变量中执行此操作,但是有没有办法对常规变量执行操作?
答案 0 :(得分:5)
如果您具有Bash 4.4或更高版本,则可以(ab)使用${parameter@P}
parameter expansion,它会扩展 parameter
,就像提示字符串一样:
$ A='/home/userA'
$ B='$A/my_file' # Single quotes to suppress expansion
$ echo "${B@P}"
/home/userA/my_file
$ A='/other/path'
$ echo "${B@P}"
/other/path/my_file
但是,正如评论中指出的那样,使用函数代替它更简单,更可移植:
$ appendfile() { printf '%s/%s\n' "$1" 'my_file'; }
$ A='/home/user'
$ B=$(appendfile "$A")
$ echo "$B"
/home/user/my_file
$ A='/other/path'
$ B=$(appendfile "$A")
$ echo "$B"
/other/path/my_file
答案 1 :(得分:1)
不。而是使用一个简单而强大的函数:
b() {
echo "$a/my_file"
}
a="/home/userA"
echo "b outputs $(b)"
a="/foo/bar"
echo "b outputs $(b)"
结果:
b outputs /home/userA/my_file
b outputs /foo/bar/my_file
这就是说,这是使系统逐字达成目标的一种丑陋方法:
# Trigger a re-assignment after every single command
trap 'b="$a/my_file"' DEBUG
a="/home/userA"
echo "b is $b"
a="/foo/bar"
echo "b is $b"
结果:
b is /home/userA/my_file
b is /foo/bar/my_file