如何取消引用从文件中读取的环境变量?

How to dereference environment variables read from file?

假设我有一个文件 fi.le:

$GNUPG_HOME
$XDG_CONFIG_HOME
$XDG_DATA_HOME

在我的备份脚本中,我想实际上取消引用这些变量(在 rsync 中通过 --include-from=fi.le

也就是$XDG_CONFIG_HOME,应该变成/home/user/.config.

我做了一个循环来检查:

while read i; do ls "$i"; done < fi.le

for i in `cat fi.le`; do ls $i; done

会return:

ls: cannot access '$XDG_DATA_HOME': No such file or directory

我想它会将“$”视为“\$”(转义)。我该如何改变它?

去掉开头的$,然后使用间接变量。

while read i; do
    i=${i/$/} # remove $
    ls "${!i}" # use `$i` as the name of a variable
done < fi.le

如果fi.le只包含环境变量,则:

while read i; do ls "$i"; done < <(envsubst < fi.le)

envsubst是你的朋友:

$ cd "$(mktemp --directory)"
$ cat > vars.txt <<'EOF'
> $HOME
> $USER
> EOF
$ envsubst < vars.txt 
/home/username
username