我的腳本中有這些變數:
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"
也會有問題)。