Bashで文字をエスケープするのに問題があります。別のユーザーでコマンドを実行するときは、単一引用符と二重引用符をエスケープしたいと思います。この質問の目的のために、次の内容を画面に表示したいとします。
'single quote phrase' "double quote phrase"
別のユーザーに切り替える必要がある場合は、すべての特殊文字をどのようにエスケープできますか?
sudo su USER -c "echo \"'single quote phrase' \"double quote phrase\"\""
もちろん、そうしても正しい結果は出ません。
答え1
次の文字列リテラル構文を使用できます。
> echo $'\'single quote phrase\' "double quote phrase"'
'single quote phrase' "double quote phrase"
~からman bash
$ 'string'形式の単語は特別に扱われます。ワードは、ANSI C規格で指定されているように置き換えられたバックスラッシュエスケープ文字を使用して文字列に展開されます。バックスラッシュエスケープシーケンスがある場合は、次のようにデコードされます。
\a alert (bell) \b backspace \e \E an escape character \f form feed \n new line \r carriage return \t horizontal tab \v vertical tab \\ backslash \' single quote \" double quote \nnn the eight-bit character whose value is the octal value nnn (one to three digits) \xHH the eight-bit character whose value is the hexadecimal value HH (one or two hex digits) \cx a control-x character
答え2
シェルで引用符をエスケープする簡単な例:
$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc
方法は、すでに開いたもの('
)を完成し、エスケープされたもの(\'
)を配置した後、別のもの('
)を開くことです。
または:
$ echo 'abc'"'"'abc'
abc'abc
$ echo "abc"'"'"abc"
abc"abc
これは開いた引用文('
)を完成させ、その引用文を別の引用文("'"
)に入れてから、別の引用文()を開いて'
実行します。
関連:一重引用符で囲まれた文字列から一重引用符をエスケープする方法は?スタックオーバーフローSEから
答え3
POSIX シェルでは、文字列に変数、コマンド、または履歴拡張がなく、改行もないと仮定し、次の基本規則に従います。
一重引用符を使用してユニバーサル文字列を引用するには:
一重引用符ではなく文字シーケンスを、前後の一重引用符が追加された同じシーケンスに置き換えます。
'aaa' ==> ''aaa''
バックスラッシュを1つずつスキップしてエスケープする既存の一重引用符文字:
' ==> \'
特に、''aaa'' ==> \''aaa'\'
二重引用符を使用してユニバーサル文字列を引用するには:
先頭と末尾の二重引用符を追加します。
aaa ==> "aaa"
すべての二重引用符文字とすべてのバックスラッシュ文字をエスケープするには、バックスラッシュを使用します。
" ==> \", \ ==> \\
いくつかの例は次のとおりです。
''aaa""bbb''ccc\\ddd'' ==> \'\''aaa""bbb'\'\''ccc\\ddd'\'\'
==> "''aaa\"\"bbb''ccc\\\\ddd''"
この方法では、例を次のように拡張できます。
#!/bin/sh
echo \''aaa'\'' "bbb"'
echo "'aaa' \"bbb\""
sudo su enzotib -c 'echo \'\'\''aaa'\''\'\'\'' "bbb"'\'
sudo su enzotib -c 'echo "'\''aaa'\'' \"bbb\""'
sudo su enzotib -c "echo \\''aaa'\\'' \"bbb\"'"
sudo su enzotib -c "echo \"'aaa' \\\"bbb\\\"\""
答え4
シンプル
出力をパイピングして二重引用符を削除するsed
sed 's/"//g'
はい
somethingThatProducesDoubleQuotesHere | removeDoubleQuotes
あるいは、将来の生活をより快適にする方法を使用することもできます。
removeDoubleQuotes() {
sed 's/"//g'
# EXAMPLES:
# somethingThatProducesDoubleQuotesHere | removeDoubleQuotes
}