Я хочу создать файл с таким именем:
"\?$*'Helloword'*$?\"
Я пытался с помощью этой команды, но результат неверный
touch \"\\\?\$\*\'\Helloword\'\*\$\?\\\"
Вы не упомянули, какая оболочка, но я предполагаю bash
. Что ж, поздравляю! Строка в кавычках / экранировании, которую вы используете, на самом деле правильная .
Так почему вы думали, что это неправильно? Вы не показали свой вывод или то, как вы его получили, но я также предполагаю, что вы использовали ls
(это естественно).
ls
возвращает '"\? $ *' \ '' Helloword '\' '* $? \"'
. Но на самом деле это просто еще одна цитируемая / экранированная форма того, о чем вы просите, "\? $ * 'Helloword' * $? \"
.
Хотите / нужно доказательство?
Сначала сделайте еще один , коснувшись
, но на этот раз используя форму, которую показывает вам ls
:
touch '"\?$*'\''Helloword'\''*$?\"'
Теперь сделайте еще одно ls
. По-прежнему там только один файл, верно?
'"\? $ *' \ '' Helloword '\' '* $? \"'
== "\? $ * 'Helloword' * $? \ "
Кроме того, exa
, современная замена для ls
, написанная на Rust, возвращает форму, с которой вы начали:
> 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
Конечно, вы можете повторить
переменную на любом этапе, чтобы убедиться, что вы на правильном пути.