linux 星号 通配符,如何在bash中转义通配符/星号字符?

简短的回答

像其他人所说的那样 - 你应该总是引用变量来防止奇怪的行为。所以使用echo“$ foo”代替echo $ foo。

长期回答

我确实认为这个例子值得进一步解释,因为它的表面看起来比它看起来更多。

我可以看到你的困惑在哪里,因为在你运行你的第一个例子后,你可能会认为shell显然正在做:参数扩展

文件名扩展

所以从你的第一个例子:me$ FOO="BAR * BAR"me$ echo $FOO

参数扩展后相当于:me$ echo BAR * BAR

文件名扩展后相当于:me$ echo BAR file1 file2 file3 file4 BAR

如果只输入echo BAR * BAR命令行,您将看到它们是等效的。

所以你可能会想到“如果我逃避*,我可以阻止文件名扩展”

所以从你的第二个例子:me$ FOO="BAR \* BAR"me$ echo $FOO

参数扩展后应相当于:me$ echo BAR \* BAR

文件名扩展后应相当于:me$ echo BAR \* BAR

如果您尝试直接在命令行中键入“echo BAR \ * BAR”,它将确实打印“BAR * BAR”,因为转义会阻止文件名扩展。

那么为什么使用$ foo不起作用?

这是因为发生了第三次扩张 - 报价清除。从bash手册中删除引用是:在前面的扩展之后,所有未引用的字符“\”,“”和“”的出现都将被删除,这些字符不是由上述扩展之一产生的。

所以当你直接在命令行输入命令时,转义字符不是先前扩展的结果,所以BASH在将它发送到echo命令之前将其删除,但在第二个例子中,“\ *”是先前参数扩展的结果,因此不会被删除。结果,echo收到“\ *”,这就是它打印的内容。

请注意第一个示例之间的差异 - “*”不包括在将被删除的字符中删除的字符中。

我希望这是有道理的。最后得出的结论 - 只是使用引号。我只是想我会解释为什么转义,如果只有参数和文件名扩展在起作用,它在逻辑上应该起作用,不起作用。

有关BASH扩展的完整说明,请参阅:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值