내 스크립트에는 다음 변수가 있습니다.
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
또는 대신 다음을 사용 zsh
하거나 다음을 사용할 수 있습니다 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"