次のコマンドを実行したいと思います。
$ sh -c 'exec python -c "print('$1$2MyString')"'
望ましい結果として'$1$2MyString'
。
ただし、コマンドを実行すると、次の結果が表示されます。
Traceback (most recent call last):
File "<string>", line 1, in <module>
NameError: name 'MysString' is not defined
私が知っている限り、3番目のレベルの引用符を追加すると、実際にコマンドが2つの部分に分割され、シェルは$1$2MyString
外部引用符を見て既知の値を変更しようとします。
一重引用符をエスケープすると
$ sh -c 'exec python -c "print(\'$1$2MyString\')"'
次のエラーが発生します。
sh: 1: Syntax error: "(" unexpected
本質的に私の質問は:上記の印刷機能に文字列リテラルを導入する方法はありますか?
ベストアンサー1
一重引用符で囲まれた文字列内では、一重引用符をエスケープできません。たとえば、以下は不完全な行です。
echo 'boy\'s game' # Wrong!
>
ただし、さまざまな種類の引用符で囲まれた文字列を連結できます。
echo "boy's"' game' # Right
boy's game
したがって、引用文"'"
などを引用できます。
sh -c 'exec python -c "print('"'"'$1$2MyString'"'"')"'
# ^-. . . . . . . . . . -^ ^-. . . . . -^ ^--^
# ^-^ ^-^
この出力は、呼び出しによって評価が実行されるためMyString
に発生します。リテラルとして使用するには、一重引用符で囲んで明示的に保護する必要があります。$1$2
sh
$1$2MyString
sh
sh -c 'exec python -c '"'"'print("$1$2MyString")'"'"
# ^-. . . . . . .-^ ^-. . . . . . . . . .-^