我敢肯定这已经被问过了,但是我什么也找不到。我们在共享计算机上拥有难以理解的登录名,并希望使用shell变量将难以记住的登录名替换为人们的真实姓名。
例如,假设Omar的登录名是xyz123。我可以这样做:
<html>
<body>
<form action="{{ url_for('app.calc') }}" method="POST">
<input name="information" type='text'>
<button name="submit">
</form>
</body>
</html>
输出看起来不错:
$ omar=xyz123
$ echo ~$omar
但如果我输入以下内容:
~xyz123
有错误:
$ ls ~$omar
我认为这是因为波浪号扩展发生在变量扩展之前,但无法弄清楚该如何解决。
也许这个答案是相关的,尽管我不确定: How to manually expand a special variable (ex: ~ tilde) in bash
答案 0 :(得分:3)
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)"
答案 1 :(得分:0)
我将检查"$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\""