我想创建一个具有此名称的文件:
"\?$*'Helloword'*$?\"
我尝试使用此命令,但结果不正确
touch \"\\\?\$\*\'\Helloword\'\*\$\?\\\"
答案1
你没有提到哪个 shell,但我假设bash
。那么,恭喜你!你使用的引用/转义字符串实际上是正确的。
那么你为什么认为它是错的?你没有展示你的输出或你如何检索它,但我还假设你使用了ls
(这很自然)。
ls
正在返回'"\?$*'\''Helloword'\''*$?\"'
。但这实际上只是您所要求的另一种引用/转义形式"\?$*'Helloword'*$?\"
。
想要/需要证据吗?
首先,再做一次,但这次使用向您显示的touch
形式:ls
touch '"\?$*'\''Helloword'\''*$?\"'
现在再做一次ls
。仍然只有一个文件,对吗?
'"\?$*'\''Helloword'\''*$?\"'
=="\?$*'Helloword'*$?\"
此外,exa
用 Rust 编写的 现代替代品ls
确实返回了您开始的形式:
> exa -l \"*
.rw-r--r-- 0 username 30 Apr 1:35 "\?$*'Helloword'*$?\"
但您无需安装即可看到它。可以使用exa
以下更基本的替代方案:ls
> echo \"*
"\?$*'Helloword'*$?\"
边注:
我有时发现逐步构建复杂的引用/转义情况更容易。例如:
> filename=Helloword
> filename="'$filename'"
> filename=\*$filename\*
> filename=\$$filename\$
> filename=\?$filename\?
> filename=\\$filename\\
> filename=\"$filename\"
> echo $filename
"\?$*'Helloword'*$?\"
> touch $filename
当然,您可以echo
在任何阶段使用变量来确保您走在正确的轨道上。