我的脚本中有这些变量:
TARGET=username
TARGET_DIR="~${TARGET}/.ssh"
我希望TARGET_DIR
var 保留此路径:/home/username/.ssh
但使用~
而不是/home/
.但是当我运行脚本并尝试.ssh
在用户名下创建新目录时,它告诉我:
mkdir: cannot create directory ‘~username/.ssh’: No such file or directory
即使 /home/username 目录存在。如果我这样做: TARGET_DIR="/home/${TARGET}/.ssh"
它有效。如何~
在变量中使用符号?
答案1
在bash
、ash
、mksh
和yash
波形符扩展发生在参数扩展之前,因此无法工作。
您可以在此处使用ksh93
orzsh
代替,或诉诸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"
也会有问题)。