定义每次使用时都要评估的bash变量

时间:2019-01-16 21:18:23

标签: linux bash shell variables scripting

我想为bash定义一个变量,该变量将在每次使用时进行评估。

我的目标是定义两个变量:

A=/home/userA
B=$A/my_file

因此,每当我更新A时,B就会被更新为A的新值。 我知道如何在提示变量中执行此操作,但是有没有办法对常规变量执行操作?

2 个答案:

答案 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