在波浪号之前扩展变量

时间:2018-11-30 20:50:35

标签: bash shell variable-expansion tilde-expansion

我敢肯定这已经被问过了,但是我什么也找不到。我们在共享计算机上拥有难以理解的登录名,并希望使用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

2 个答案:

答案 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\""