如何将带有 ~ 的路径保存到变量中?

如何将带有 ~ 的路径保存到变量中?

我的脚本中有这些变量:

TARGET=username
TARGET_DIR="~${TARGET}/.ssh"

我希望TARGET_DIRvar 保留此路径:/home/username/.ssh但使用~而不是/home/.但是当我运行脚本并尝试.ssh在用户名下创建新目录时,它告诉我:

mkdir: cannot create directory ‘~username/.ssh’: No such file or directory

即使 /home/username 目录存在。如果我这样做: TARGET_DIR="/home/${TARGET}/.ssh" 它有效。如何~在变量中使用符号?

答案1

bashashmkshyash波形符扩展发生在参数扩展之前,因此无法工作。

您可以在此处使用ksh93orzsh代替,或诉诸eval

user=username # making sure it's a valid username
eval "user_home=~$user"
target_dir=$user_home/.ssh

如果您的系统有getent命令(现在很常见),您还可以使用:

user_home=$(getent -- passwd "$user" | cut -d: -f6)

或者使用perl

user_home=$(perl -le 'for (@ARGV) {
  @u = getpwnam$_ or die "No such user: $_\n";
  print $u[7]}' -- "$user")

这也适用于用户名中包含不常见字符的用户(例如 zsh 的空格,~$user但不是ksh93~"$user"也会有问题)。

相关内容