我遇到这些问题已经有一段时间了。我尝试过不同的方法,但都无济于事。
答案1
使用here-document(其中分隔符here.
被引用,以便从字面上理解here-doc的内容)输入会更容易:
xargs -d'\n' touch -- << '.'
\*\\'"Best School"\'\\*$\?\*\*\*\*\*:)
.
(这里假设 GNU xargs
)或:
touch -- "$(cat << '.'
\*\\'"Best School"\'\\*$\?\*\*\*\*\*:)
.
)"
与ksh
或zsh
,
touch -- "$(<< '.'
\*\\'"Best School"\'\\*$\?\*\*\*\*\*:)
.
)"
也有效,并且可以mksh
有效地将其视为多行引用的一种形式作为优化。看了解 Bash 的读取文件命令替换了解详情。
与rc
外壳或衍生物或zsh
之后set -o rcquotes
:
touch '\*\\''"Best School"\''\\*$\?\*\*\*\*\*:)'
在那里,您只需要将名称括在单引号中,然后将单引号转义即可''
。
答案2
简单地
touch "\\\*\\\\'\"Best School\"\\'\\\\\*\$\\\?\\\*\\\*\\\*\\\*\\\*:)"
文件名表明您知道引号和反斜杠的使用,所以这应该很容易。但请重新考虑您的流程/工作流程,因为您更适合使用普通名称。
答案3
在sh
兼容 shell 中,例如bash
,单引号整个字符串,然后用'\''
(或'"'"'
)替换每个内部单引号:
touch -- '\*\\'\''"Best School"\'\''\\*$\?\*\*\*\*\*:)'
每个内部序列都'\''
暂时脱离外部单引号字符串,插入转义单引号,然后继续单引号字符串。
这是必要的,因为单引号字符串不能包含单引号。
您还可以使用此处引用的文档:
touch -- "$(cat <<'END_NAME'
\*\\'"Best School"\'\\*$\?\*\*\*\*\*:)
END_NAME
)"
这用于cat
传递来自此处文档重定向的字符串。该文档(在本例中为单行)作为命令替换的结果传递,shell 不会干扰其内容,因为对初始文档分隔符 ( 'END_NAME'
) 的引用会阻止它对扩展起作用。
(无论如何,我们的示例字符串中没有有效的扩展,但是引用此处文档将避免扩展看起来像通用字符串中的变量或命令替换的内容)。
答案4
确保您有一个可以打印正确文件名的变量。然后触摸变量。在使用该命令之前,您可以根据需要多次 printf 以获得文件名touch
。
$ var='\*\\'\''"Best School"\'\''\\*$\?\*\*\*\*\*:)'
$ printf '%s\n' "$var"
\*\\'"Best School"\'\\*$\?\*\*\*\*\*:)
$ touch "$var"
也许:
$ var=$'\*\\\\\'"Best School"\\\'\\\\*$\\?\\*\\*\\*\\*\\*:)';echo "$var"
\*\\'"Best School"\'\\*$\?\*\*\*\*\*:)
或者任何其他方法来获取变量内的正确值。