如何將帶有 ~ 的路徑儲存到變數中?

如何將帶有 ~ 的路徑儲存到變數中?

我的腳本中有這些變數:

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"也會有問題)。

相關內容