回答:
デニスは彼の答えで通常の代替案を指摘しています(シングルインダブル、ダブルインシングル、エスケープされたシングルクォートで連結されたシングルクォートされた文字列;あなたはすでにPerlのカスタマイズ可能なクォート演算子に言及しました)にとって。
Bourneのようなシェル(sh、ksh、ash、dash、bash、zshなど)では、単一引用符で囲まれた文字列は完全にリテラルです。これにより、シェルがエスケープせずに特別に処理する文字を簡単に含めることができますが、単一引用符文字自体を単一引用符付き文字列に含めることはできません。
cshタイプのシェルは他の点で完全に壊れているので、私も考えることを拒否します(Cshプログラミングが有害と見なされるを参照)。
blah <<\EOF … EOF
。<<'EOF'
およびを使用することもできます<<"EOF
。それらはすべて、Perlとは異なり、リテラルのhereドキュメントを意味します。あなたが本当に決心していれば、あなたはすることができますblah "$(cat<<\EOF … EOF )" other args
(コマンド置換でスペースを書いた改行を使用して、kshとzshはcatなしでできますが、他の人はそれを必要とします)。しかし、それは本当に価値があるでしょうか?
echo '\U0000068\U000069'
echo 'hi')。ただし、シェルのバグでない限り、理由はわかりません。
\U
その場合の解釈は、組み込みのechoコマンドによって行われます(この動作は、-E
またはBSD_ECHOオプションとによって制御できます-e
)。リテラル文字列が他のコマンドで渡されている(他の方法で解釈されていない)ことがわかります。例えばprintf %s\\n '\U0000068\U000069'
。
私にとって、あなたのすべての例は以下を生成します:
こんにちは世界!
これも同様です。
perl -e 'print "Hello, world!", "\n";'
この:
perl -e 'print '\''Hello, world!'\'', "\n";'
何をしようとしているのか明確にできますか?
Bashなどのシェルでは、文字列の一部として引用符を印刷する場合、1種類の引用符が他の引用符をエスケープします。
$ echo '"Hello, world!"'
"Hello, world!"
$ echo "'Hello, world!'"
'Hello, world!'
編集:
別の方法を次に示します。
$ perl -e 'print "\047Hello, world!\047", "\n";'
'Hello, world!'
$ echo -e "\047Hello, world! \047"
'Hello, world! '
感嘆符の後のスペースは、履歴展開エラーを回避します。set +H
代わりにできたかもしれません。
ここで、エスケープを気にしないための最良の方法がここにあります。
$ cat <<EOF
my $var = "Hello";
print $text, ', world!', "\n";'
EOF
引用されたこちらのドキュメントを使用して、すべての拡張を完全に禁止することができます。
$ cat <<'EOF'
my $var = "Hello";
print $text, ', world!', "\n";'
EOF
入力の代わりに引数として渡したい場合は、xargsを使用できます。
$ xargs -0 <<'EOF' perl -e
my $var = "Hello";
print $text, ', world!', "\n";'
EOF
bashでこれを行うオプションがあるかどうかはわかりませんが、zsh ''
では、RC_QUOTES
オプションをオンにした後に使用できます。(zshを試すことをお勧めします。ほとんどの場合、bashと互換性があり、さらに互換性を保つためにbashをエミュレートできます。)
bash(および、ほとんどの場合はzsh)では、を使用する'\''
よりも読みやすいので使用しています'"'"'
。
私はcshでそれを行う方法がまったくわかりません。