在波浪号之前扩展变量
Expand variable before tilde
我确定以前有人问过这个问题,但我找不到任何东西。我们在共享计算机上有难以理解的登录名,想使用 shell 变量来用难以记住的登录名代替人们的真实姓名。
例如,假设 Omar 的登录名是 xyz123。我可以这样做:
$ omar=xyz123
$ echo ~$omar
输出看起来不错:
~xyz123
但是如果我输入这个:
$ ls ~$omar
出现错误:
ls: cannot access ~xyz123: No such file or directory
我认为这是因为波浪线扩展发生在变量扩展之前,但不知道如何解决这个问题。
也许这个答案是相关的,虽然我不确定:
How to manually expand a special variable (ex: ~ tilde) in bash
bash 扩展波浪号 在 变量之前。参见 https://www.gnu.org/software/bash/manual/bash.html#Shell-Expansions
shell 将查看文字字符 $
o
m
a
r
是否为登录名。因为它们不是,波浪号没有展开。 shell 最终将 $omar
视为一个变量并将其替换。然后它将扩展后的单词 ~xyz123
传递给 echo
并打印它。
同样,它将单词~xyz123
传递给ls
。由于 ls 不进行自己的波浪号扩展,它会在当前目录中查找名为 ~xyz123
且带有文字波浪号的文件。由于这样的文件不存在,您会收到该错误。
如果你想ls ~$var
列出文件,你需要eval ls ~$var
。或者,由于 eval 被认为随便使用是非常不安全的,您可以改为这样做:
ls "$(getent passwd "$omar" | cut -d: -f6)"
我会检查 "$omar"
是否是 id
的有效用户,然后使用 eval
强制双重扩展。所以防邪eval
然后去做
if ! id "$omar" >/dev/null 2>&1;
echo "Error: user with the name $omar does not exist!" >&2
exit 1
fi
eval echo "\"~$omar\""
我确定以前有人问过这个问题,但我找不到任何东西。我们在共享计算机上有难以理解的登录名,想使用 shell 变量来用难以记住的登录名代替人们的真实姓名。
例如,假设 Omar 的登录名是 xyz123。我可以这样做:
$ omar=xyz123
$ echo ~$omar
输出看起来不错:
~xyz123
但是如果我输入这个:
$ ls ~$omar
出现错误:
ls: cannot access ~xyz123: No such file or directory
我认为这是因为波浪线扩展发生在变量扩展之前,但不知道如何解决这个问题。
也许这个答案是相关的,虽然我不确定: How to manually expand a special variable (ex: ~ tilde) in bash
bash 扩展波浪号 在 变量之前。参见 https://www.gnu.org/software/bash/manual/bash.html#Shell-Expansions
shell 将查看文字字符 $
o
m
a
r
是否为登录名。因为它们不是,波浪号没有展开。 shell 最终将 $omar
视为一个变量并将其替换。然后它将扩展后的单词 ~xyz123
传递给 echo
并打印它。
同样,它将单词~xyz123
传递给ls
。由于 ls 不进行自己的波浪号扩展,它会在当前目录中查找名为 ~xyz123
且带有文字波浪号的文件。由于这样的文件不存在,您会收到该错误。
如果你想ls ~$var
列出文件,你需要eval ls ~$var
。或者,由于 eval 被认为随便使用是非常不安全的,您可以改为这样做:
ls "$(getent passwd "$omar" | cut -d: -f6)"
我会检查 "$omar"
是否是 id
的有效用户,然后使用 eval
强制双重扩展。所以防邪eval
然后去做
if ! id "$omar" >/dev/null 2>&1;
echo "Error: user with the name $omar does not exist!" >&2
exit 1
fi
eval echo "\"~$omar\""