私はしばらくこれらの問題を経験しています。いろいろ試してみましたが役に立ちませんでした。
答え1
here-document(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
たとえば、互換性のあるシェルでは、bash
文字列全体を一重引用符で囲み、各内部一重引用符を'\''
(または)に置き換えます。'"'"'
touch -- '\*\\'\''"Best School"\'\''\\*$\?\*\*\*\*\*:)'
各内部シーケンスは'\''
一時的に外部一重引用符文字列を分離し、エスケープされた一重引用符を挿入してから一重引用符文字列を続けます。
一重引用符で囲まれた文字列に一重引用符を含めることはできないため、これは必須です。
ここで参照されている文書を使用することもできます。
touch -- "$(cat <<'END_NAME'
\*\\'"Best School"\'\\*$\?\*\*\*\*\*:)
END_NAME
)"
cat
これはここでドキュメントリダイレクトの文字列を渡すために使用されます。文書(この場合は1行)はコマンド置換の結果として渡され、'END_NAME'
初期文書区切り記号()への参照によって文書が拡張に作用するのを防ぐため、シェルはその内容を妨げません。
(とにかく、サンプル文字列には有効な拡張はありませんが、ここに文書を引用すると、通常の文字列で変数やコマンドの置換のように見える拡張を避けることができます。)
答え4
正しいファイル名を印刷する変数があることを確認してください。次に変数をタッチします。このコマンドを使用する前に、ファイル名を取得するために必要なだけprintfを使用できますtouch
。
$ var='\*\\'\''"Best School"\'\''\\*$\?\*\*\*\*\*:)'
$ printf '%s\n' "$var"
\*\\'"Best School"\'\\*$\?\*\*\*\*\*:)
$ touch "$var"
おそらく:
$ var=$'\*\\\\\'"Best School"\\\'\\\\*$\\?\\*\\*\\*\\*\\*:)';echo "$var"
\*\\'"Best School"\'\\*$\?\*\*\*\*\*:)
または、変数内で正しい値を取得する別の方法。