次のコマンドがあります
cmd '"asdf" "a'sdf"'
引数は一重引用符のみで囲む必要があります。cmd は、何らかの理由で二重引用符では機能しません。真ん中のシングルが最初の一重引用符を終了するため、上記のコマンドは機能しません。逃げたら次へ
cmd '"asdf" "a\'sdf"'
それはまだ動作しません。これを機能させるにはどうすればよいですか?
bashのmanページによると:
Enclosing characters in single quotes preserves the literal value
of each character within the quotes. A single quote may not occur
between single quotes, even when preceded by a backslash.
したがって、どのように試みても、単一引用符で囲まれた文字列内に単一引用符を含めることはできません。'\''
ただし、スクリプトの設定方法によっては、最初の一重引用符を終了し、2 番目をエスケープし、3 番目で別の一重引用符で囲まれた文字列を開始するを使用できる場合があります。
むかしむかし、メンターは私が のような構造を使用することを提案し'"asdf" "a'"'"'sdf"'
ました。動作しますが、見るのは奇妙です。
一重引用符の中に一重引用符を入れることはできないので、エスケープするの'"asdf" "a'\''sdf'
が良いかもしれません。
printf
および変数を対話的に、またはシェル スクリプト内で使用することもできることに注意してください。ほとんどのシェル (使用しているものを指定していません) では、次のような結果が得られるはずです。
$ fmt='"asdf" "a%ssdf"\n'
$ printf "$fmt" "'"
"asdf" "a'sdf"
$
または、ASCII 値を使用して一重引用符を含めることもできます。
$ fmt='"asdf" "a\047sdf"\n'
$ printf "$fmt"
"asdf" "a'sdf"
$
またはcshで:
% set fmt='"asdf" "a\047sdf"\n'
% printf "$fmt"
"asdf" "a'sdf"
%
printf
シェルにコマンドが組み込まれていない場合 (Bash のように)、コマンドは /bin または /usr/bin に別のバイナリとして存在する可能性が高いため、これはシェルに依存しません。
あなたのユースケースがわからないので、適用できるとわかっている解決策を思いつくのは難しい.
オートコンプリートをいつでも使用して、答えを見つけることができます。
たとえば、アポストロフィを含むファイルがあり、パスを一重引用符で囲みたい場合は、これを行うことができます (cat
ファイルの名前が であるコマンドの例として使用sam's file.txt
):
cat 'sam[press tab here]
私にとっては、これにオートコンプリートされます:
cat 'sam'\''s\ file.txt
だから、どうやらそれは可能です。別の回答者'\''
が最初にそのことについて言及しましたが、それがうまくいかない場合は、それを理解するための1つの方法を教えてあげたいと思いました(そして、私は別の証人になり、他の答えがうまくいくようだとあなたに伝えたいと思いました)。