私のスクリプトには次の変数があります。
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"