如何取消引用从文件中读取的环境变量?
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
假设我有一个文件 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