質問

ということか、Bash alias のように:

alias rxvt='urxvt'

る働きます。

しかし:

alias rxvt='urxvt -fg '#111111' -bg '#111111''

が成り立たないと思うものです:

alias rxvt='urxvt -fg \'#111111\' -bg \'#111111\''

定できるようになりましたで終わるのかタッチの開閉引用符内の文字列ば引用符?

alias rxvt='urxvt -fg'\''#111111'\'' -bg '\''#111111'\''

そうungainlyこのように表示されるものと同じ文字列の場合販売するチャコットが勝どきに複を連結しています。

役に立ちましたか?

解決

またシングルクォーテーションの一番外側の層を記憶できる接着剤の両方の種類の引用です。例:

 alias rxvt='urxvt -fg '"'"'#111111'"'"' -bg '"'"'#111111'"'"
 #                     ^^^^^       ^^^^^     ^^^^^       ^^^^
 #                     12345       12345     12345       1234

説明 '"'"' として解釈するだけで ':

  1. ' 終了の最初の見積りを用シングルクォーテーション.
  2. " 第見積もりをダブルクォート.
  3. ' 引用文字です。
  4. " 終了第二の見積もりをダブルクォート.
  5. ' 開始第三の見積もり、シングルクォーテーション.

まこりの多い場所に置かないの間に空白(1)及び(2)と(4)、(5)、シェルまで解釈の文字列として一つの言葉です。

他のヒント

'\''

私はいつもちょうど配列とそれぞれ埋め込まれた単一引用符を置き換える(つまり:引用バックスラッシュ引用引用)、文字列を閉じエスケープ単一引用符を追加し、文字列を再オープンしました。

<時間>

私はよく私のためにこれを行うには、私のPerlスクリプトで「quotify」機能をかき立てます。手順は以下のようになります:

s/'/'\\''/g    # Handle each embedded quote
$_ = qq['$_']; # Surround result with single quotes.

このほとんどは、すべてのケースの世話をする。

あなたはシェルスクリプトにevalを導入したときに人生はもっと楽しくなります。あなたは、本質的に、再びすべてを再quotifyする必要があります!

例えば、上記の文を含むquotify呼ばれるPerlスクリプトを作成します

#!/usr/bin/perl -pl
s/'/'\\''/g;
$_ = qq['$_'];

を正しく引用符で囲まれた文字列を生成するためにそれを使用します:

$ quotify
urxvt -fg '#111111' -bg '#111111'

結果:

'urxvt -fg '\''#111111'\'' -bg '\''#111111'\'''

これはその後、aliasコマンドにペースト/コピーすることができます:

alias rxvt='urxvt -fg '\''#111111'\'' -bg '\''#111111'\'''

(あなたはevalのにコマンドを挿入する必要がある場合は、もう一度quotifyを実行します:

 $ quotify
 alias rxvt='urxvt -fg '\''#111111'\'' -bg '\''#111111'\'''

結果:

'alias rxvt='\''urxvt -fg '\''\'\'''\''#111111'\''\'\'''\'' -bg '\''\'\'''\''#111111'\''\'\'''\'''\'''

これはコピー/ evalのに貼り付けることができます:

eval 'alias rxvt='\''urxvt -fg '\''\'\'''\''#111111'\''\'\'''\'' -bg '\''\'\'''\''#111111'\''\'\'''\'''\'''

バッシュ 2.04 の構文$'string'(だけではなく'string'の以来;警告:混同しないでください)$('string')ととに拡張を行うの ANSI C状エスケープシーケンスを可能にする他の引用メカニズムであります単一引用符で囲まれたバージョンます。

簡単な例:

  $> echo $'aa\'bb'
  aa'bb

  $> alias myvar=$'aa\'bb'
  $> alias myvar
  alias myvar='aa'\''bb'

あなたの場合:

$> alias rxvt=$'urxvt -fg \'#111111\' -bg \'#111111\''
$> alias rxvt
alias rxvt='urxvt -fg '\''#111111'\'' -bg '\''#111111'\'''

一般的なエスケープシーケンス期待通りに動作します:

\'     single quote
\"     double quote
\\     backslash
\n     new line
\t     horizontal tab
\r     carriage return
<時間>

以下man bash(バージョン4.4)からコピー+貼り付け関連ドキュメントである

フォーム$「文字列」の言葉は特別に扱われます。言葉は、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
    \?     question mark
    \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)
    \uHHHH the Unicode (ISO/IEC 10646) character whose value is 
           the hexadecimal value HHHH (one to four hex digits)
    \UHHHHHHHH the Unicode (ISO/IEC 10646) character whose value 
               is the hexadecimal value HHHHHHHH (one to eight 
               hex digits)
    \cx    a control-x character
ドル記号が存在していなかったかのように

拡大の結果は、単一引用符で囲まれています。

<時間>

引用を参照してくださいエスケープ:文字列のようなANSI Cは、bashの-ハッカーにを。詳細は、組織のwiki。また、(その「バッシュの変更」のファイルに注意してくださいここの概要)メカニズムを引用$'string'に関連する変更やバグ修正のために多くのことを言及しています。

unix.stackexchange.com によると、通常1などの特殊文字を使用する方法?bashで(いくつかのバリエーションで)それが動作するはずを、zshの、mksh、は、ksh93とFreeBSDとbusyboxののSHます。

私は彼のブログにエントリが表示されない(リンクPLSを?)が、<のhref = "http://www.gnu.org/software/bash/manual/bashref.html#Single-Quotesに従って"REL =" noreferrer "> GNUリファレンスマニュアルでます:

  

単一引用符内の文字を囲みます   (「'」)は、リテラル値を保持します   引用符内の各文字。 A   間に発生しないことがあり、一重引用符   Aが先行しても、単一引用符、   バックスラッシュます。

ので、bashが理解できないだろう。

alias x='y \'z '

あなたは二重引用符で囲む場合は、

ただし、これを行うことができます:

alias x="echo \'y "
> x
> 'y

私は、単一引用符で囲まれた文字列内の単一引用符のため'\''を使用すると、バッシュで仕事をしていることを確認することができ、そしてそれは、スレッドで、以前から「糊付け」の引数と同じように説明できます。 'A '\''B'\'' C'(ここでは、すべての引用符は、単一引用符です):私たちは引用符で囲まれた文字列があるとします。エコーに渡された場合、それは次のように出力されますA 'B' C。 それぞれにおいて、最初の引用符は、現在の単一引用符で囲まれた文字列は、以下の'\''グルー前の文字列に単一引用符(\'は引用符で囲まれた文字列を起動せずに単一引用符を指定する方法である)閉じ\'、そして最後の引用は、他のシングルを開きます引用符で囲まれた文字列ます。

シェルの中で引用符をエスケープする簡単な例:

$ echo 'abc'\''abc'
abc'abc
$ echo "abc"\""abc"
abc"abc

これは、既にオープン1('を)仕上げによって行われます、配置は、別の1(\')を開く、1(')を脱出しました。この構文は、すべてのコマンドのために動作します。これは、第一の答えに非常によく似たアプローチです。

どちらのバージョンは「二重引用符( "")内の単一引用符文字を囲むことによって、または連結でエスケープ単一引用符(\)」を使用するか連結して、作業しているます。

質問の著者は、彼の最後の脱出の試みの最後に余分な単一引用符( ')があったことに気づきませんでした

alias rxvt='urxvt -fg'\''#111111'\'' -bg '\''#111111'\''
           │         │┊┊|       │┊┊│     │┊┊│       │┊┊│
           └─STRING──┘┊┊└─STRIN─┘┊┊└─STR─┘┊┊└─STRIN─┘┊┊│
                      ┊┊         ┊┊       ┊┊         ┊┊│
                      ┊┊         ┊┊       ┊┊         ┊┊│
                      └┴─────────┴┴───┰───┴┴─────────┴┘│
                          All escaped single quotes    │
                                                       │
                                                       ?
あなたはASCII / Unicodeの芸術の前の素敵な作品に見ることができるように

、最後は「()不要な単一引用符が続いている単一引用符(\)」を脱出しました。メモ帳++内の1つの存在のような構文ハイライトを使用すると、非常に有用証明することができます。

同じことは以下のような他の例についても同様である。

alias rc='sed '"'"':a;N;$!ba;s/\n/, /g'"'"
alias rc='sed '\'':a;N;$!ba;s/\n/, /g'\'

エイリアスのこれら二つの美しいのインスタンスは、ファイルがダウンして並ぶことができる方法は非常に複雑で難読化された形で表示されます。それはあなたが前の行の内容との間にカンマとスペースで一つだけの行を取得する行の多くのファイルから、です。以前のコメントの意味を理解するためには、以下が例です。

$ cat Little_Commas.TXT
201737194
201802699
201835214

$ rc Little_Commas.TXT
201737194, 201802699, 201835214
よく、時々、それは別のアプローチを検討するだけの合理的だ、ので、

私は、特に引用問題に対処していない。

rxvt() { urxvt -fg "#${1:-000000}" -bg "#${2:-FFFFFF}"; }

あなたが、その後のように呼び出すことができます:

rxvt 123456 654321

アイデアは、今、このエイリアス引用符を気にせずにあなたができることをされます:

alias rxvt='rxvt 123456 654321'

または、あなたには、いくつかの理由のためにすべてのコールで#を含める必要がある場合:

rxvt() { urxvt -fg "${1:-#000000}" -bg "${2:-#FFFFFF}"; }

あなたが、その後のように呼び出すことができます:

rxvt '#123456' '#654321'

そして、もちろん、別名があります:

alias rxvt="rxvt '#123456' '#654321'"

(おっと、私は一種の引用に対処しなかったと思います:)

私はちょうど..例えばシェルコードを使用します該当する\x27または\\x22。ノー面倒、今まで本当にます。

これは、単一引用符で囲まれた文字列内の単一引用符を置くことができないのでは、最も簡単で読みやすいオプションでは、ヒアドキュメントの文字列を使用することです。

command=$(cat <<'COMMAND'
urxvt -fg '#111111' -bg '#111111'
COMMAND
)

alias rxvt=$command

コマンド置換表記catを介して、上記のコードでは、ヒアドキュメントは$(..)コマンドに送られ、その出力が変数に割り当てられています

ヒアドキュメントの周りの単一引用符を置くことは必要とされていることが$()内にあるので、

本当の答え私見では、単一引用符で囲まれた文字列内の単一引用符をエスケープすることができないということです。

そのことは不可能。

我々が想定した場合、

私たちは、bashのを使用しています。

bashのマニュアルから...

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.

あなたは他の文字列エスケープメカニズム」または\

のいずれかを使用する必要があります

それは単一引用符を使用して要求aliasについての魔法は何もありません。

はbashで、次の仕事の両方ます。

alias rxvt="urxvt -fg '#111111' -bg '#111111'"
alias rxvt=urxvt\ -fg\ \'#111111\'\ -bg\ \'#111111\'

後者は空白文字をエスケープする\を使用しています。

単一引用符が必要です#111111について魔法何もありません。

次のオプションが期待通りにrxvtのエイリアスが動作することで、同じ結果に他の2つのオプションを実現します。

alias rxvt='urxvt -fg "#111111" -bg "#111111"'
alias rxvt="urxvt -fg \"#111111\" -bg \"#111111\""

また、直接面倒#をエスケープすることができます。

alias rxvt="urxvt -fg \#111111 -bg \#111111"

これらの答えをヒットでは特にまいます。が一般的なアプローチを試みることを友達や開発を行っていることを可能に恣意的な引用の場合に必要なものを引用bashコマンドを複数層のシェ拡大などを通じて、ssh su -c, bash -c, など。ある一つの中核プリミティブだが、こちらのネイティブbash:

quote_args() {
    local sq="'"
    local dq='"'
    local space=""
    local arg
    for arg; do
        echo -n "$space'${arg//$sq/$sq$dq$sq$dq$sq}'"
        space=" "
    done
}

これはどう:でシェル-見積は各引数の個別後bashの拡大はもちろん):

$ quote_args foo bar
'foo' 'bar'
$ quote_args arg1 'arg2 arg2a' arg3
'arg1' 'arg2 arg2a' 'arg3'
$ quote_args dq'"'
'dq"'
$ quote_args dq'"' sq"'"
'dq"' 'sq'"'"''
$ quote_args "*"
'*'
$ quote_args /b*
'/bin' '/boot'

その中でもとくに明らかなことの一層の展開:

$ bash -c "$(quote_args echo a'"'b"'"c arg2)"
a"b'c arg2

(ただし、ダブルクォート周りに $(quote_args ...) 必要なのは、結果を単一の引数 bash -c.) 使用できるより一般的に引用を適切に複数の層を拡大す:

$ bash -c "$(quote_args bash -c "$(quote_args echo a'"'b"'"c arg2)")"
a"b'c arg2

上記の例:

  1. シェル-見積は各引数の内 quote_args 個人およびその合結果の出力を単一の引数と内側のダブルクォート.
  2. シェル-見積 bash, -c, の利回価結果から手順1のあと、その結果を単一の引数と外側のダブルクォート.
  3. を送信しゃれしているので、引数としての外 bash -c.

その際に野外で調べてみたのです。できない複雑なものとのことですがに気を付ける必要がありめの評価つの部分文字列は引用符で括るようにした。例えば、以下のいを誤ったもの(一部の定義の"違い"):

$ (cd /tmp; bash -c "$(quote_args cd /; pwd 1>&2)")
/tmp
$ (cd /tmp; bash -c "$(quote_args cd /; [ -e *sbin ] && echo success 1>&2 || echo failure 1>&2)")
failure

最初の例では、bashすぐに拡大 quote_args cd /; pwd 1>&2 二つの別々のコマンド quote_args cd /pwd 1>&2, ので、CWDはいまだに /tmp 場合に pwd コマンドが実行されます。次の例が示すように同様の問題globbing.実際、同じ基本的な問題が生じたすべてのbashを開始しました。ここでの問題は、コマンド置換な機能電話:ので文字通りの評価を行うことbashスクリプトを使用その出力、そして教えてくれてありがとうbashを記述します。

しようとした場合には単に脱出のシェルの事業者まなので文字列を渡す bash -c は単なる記号の列の個別の引用文字列をなしとして解釈されるオペレータが見やすい場合はエコー文字列として渡されたbash:

$ (cd /tmp; echo "$(quote_args cd /\; pwd 1\>\&2)")
'cd' '/;' 'pwd' '1>&2'
$ (cd /tmp; echo "$(quote_args cd /\; \[ -e \*sbin \] \&\& echo success 1\>\&2 \|\| echo failure 1\>\&2)")
'cd' '/;' '[' '-e' '*sbin' ']' '&&' 'echo' 'success' '1>&2' '||' 'echo' 'failure' '1>&2'

ここでの問題は、い過引用.必要なものは事業者が非公開として入力を囲む bash -c, とで、彼らが必要な外部の $(quote_args ...) コマンドに代入します。

その結果、必要なものはほとんどの一般的な意味ではシェル-見積りにより単語をコマンドを拡張する時にコマンド置換別途、適用しないうタイトルを引用してもシェルにオペレーター

$ (cd /tmp; echo "$(quote_args cd /); $(quote_args pwd) 1>&2")
'cd' '/'; 'pwd' 1>&2
$ (cd /tmp; bash -c "$(quote_args cd /); $(quote_args pwd) 1>&2")
/
$ (cd /tmp; echo "$(quote_args cd /); [ -e *$(quote_args sbin) ] && $(quote_args echo success) 1>&2 || $(quote_args echo failure) 1>&2")
'cd' '/'; [ -e *'sbin' ] && 'echo' 'success' 1>&2 || 'echo' 'failure' 1>&2
$ (cd /tmp; bash -c "$(quote_args cd /); [ -e *$(quote_args sbin) ] && $(quote_args echo success) 1>&2 || $(quote_args echo failure) 1>&2")
success

お客さま人数小児-幼児にこの文字列全体の公正なゲームの更なる引用に任意のレベルの評価:

$ bash -c "$(quote_args cd /tmp); $(quote_args bash -c "$(quote_args cd /); $(quote_args pwd) 1>&2")"
/
$ bash -c "$(quote_args bash -c "$(quote_args cd /tmp); $(quote_args bash -c "$(quote_args cd /); $(quote_args pwd) 1>&2")")"
/
$ bash -c "$(quote_args bash -c "$(quote_args bash -c "$(quote_args cd /tmp); $(quote_args bash -c "$(quote_args cd /); $(quote_args pwd) 1>&2")")")"
/
$ bash -c "$(quote_args cd /tmp); $(quote_args bash -c "$(quote_args cd /); [ -e *$(quote_args sbin) ] && $(quote_args echo success) 1>&2 || $(quote_args echo failure) 1>&2")"
success
$ bash -c "$(quote_args bash -c "$(quote_args cd /tmp); $(quote_args bash -c "$(quote_args cd /); [ -e *sbin ] && $(quote_args echo success) 1>&2 || $(quote_args echo failure) 1>&2")")"
success
$ bash -c "$(quote_args bash -c "$(quote_args bash -c "$(quote_args cd /tmp); $(quote_args bash -c "$(quote_args cd /); [ -e *$(quote_args sbin) ] && $(quote_args echo success) 1>&2 || $(quote_args echo failure) 1>&2")")")"
success

など。

これらの例にあるようoverwroughtこんな言葉を success, sbin, は、 pwd にする必要はなシェルされなかったが、キーポイントは書き込みスクリプトを任意に入力したい見積もりもないんだよ" 必要な引用がか分かりませんが、ユーザーが投げる Robert'; rm -rf /.

いかに、いぶ慣れてきたので次回作は小型のヘルパーの機能:

debug_args() {
    for (( I=1; $I <= $#; I++ )); do
        echo -n "$I:<${!I}> " 1>&2
    done
    echo 1>&2
}

debug_args_and_run() {
    debug_args "$@"
    "$@"
}

る列挙の各引数をコマンドを実行する前に、す:

$ debug_args_and_run echo a'"'b"'"c arg2
1:<echo> 2:<a"b'c> 3:<arg2> 
a"b'c arg2

$ bash -c "$(quote_args debug_args_and_run echo a'"'b"'"c arg2)"
1:<echo> 2:<a"b'c> 3:<arg2> 
a"b'c arg2

$ bash -c "$(quote_args debug_args_and_run bash -c "$(quote_args debug_args_and_run echo a'"'b"'"c arg2)")"
1:<bash> 2:<-c> 3:<'debug_args_and_run' 'echo' 'a"b'"'"'c' 'arg2'> 
1:<echo> 2:<a"b'c> 3:<arg2> 
a"b'c arg2

$ bash -c "$(quote_args debug_args_and_run bash -c "$(quote_args debug_args_and_run bash -c "$(quote_args debug_args_and_run echo a'"'b"'"c arg2)")")"
1:<bash> 2:<-c> 3:<'debug_args_and_run' 'bash' '-c' ''"'"'debug_args_and_run'"'"' '"'"'echo'"'"' '"'"'a"b'"'"'"'"'"'"'"'"'c'"'"' '"'"'arg2'"'"''> 
1:<bash> 2:<-c> 3:<'debug_args_and_run' 'echo' 'a"b'"'"'c' 'arg2'> 
1:<echo> 2:<a"b'c> 3:<arg2> 
a"b'c arg2

$ bash -c "$(quote_args debug_args_and_run bash -c "$(quote_args debug_args_and_run bash -c "$(quote_args debug_args_and_run bash -c "$(quote_args debug_args_and_run echo a'"'b"'"c arg2)")")")"
1:<bash> 2:<-c> 3:<'debug_args_and_run' 'bash' '-c' ''"'"'debug_args_and_run'"'"' '"'"'bash'"'"' '"'"'-c'"'"' '"'"''"'"'"'"'"'"'"'"'debug_args_and_run'"'"'"'"'"'"'"'"' '"'"'"'"'"'"'"'"'echo'"'"'"'"'"'"'"'"' '"'"'"'"'"'"'"'"'a"b'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'c'"'"'"'"'"'"'"'"' '"'"'"'"'"'"'"'"'arg2'"'"'"'"'"'"'"'"''"'"''> 
1:<bash> 2:<-c> 3:<'debug_args_and_run' 'bash' '-c' ''"'"'debug_args_and_run'"'"' '"'"'echo'"'"' '"'"'a"b'"'"'"'"'"'"'"'"'c'"'"' '"'"'arg2'"'"''> 
1:<bash> 2:<-c> 3:<'debug_args_and_run' 'echo' 'a"b'"'"'c' 'arg2'> 
1:<echo> 2:<a"b'c> 3:<arg2> 
a"b'c arg2

与えられた例では、単に外側のエスケープ機構として二重引用符の代わりに単一引用符を使用する:

alias rxvt="urxvt -fg '#111111' -bg '#111111'"

このアプローチは、あなただけのコマンドに固定された文字列を渡したい、多くの場合に適しています。ただ、シェルがechoを通じて、二重引用符で囲まれた文字列を解釈し、必要に応じてバックスラッシュで文字をエスケープする方法をご確認ください。

の例では、二重引用符は、文字列を保護するのに十分であることを参照してくださいね

$ echo "urxvt -fg '#111111' -bg '#111111'"
urxvt -fg '#111111' -bg '#111111'

こちらは家の答えなのは、上述:

ありますのダウンロードをキューとしてのエスケープファイル名は"で!(OMG!) まbash一のためのssh。同じ原理が交互に見積りのデリミタを付与するものであります。

例えば、ということかについて:ルイスTherouxスピリチュアル-アンビエント-の物語...

  1. まず同封してルイスTherouxにシングルクォーテーションbashの場合、ダブルクォートのためにssh:'"ルイスTheroux"'
  2. そしてご利用のシングルクォーテーションに逃れ、二重引用符'"'
  3. の二重引用符を使用して脱出し、引用符"'"
  4. その繰り返しストラン#2、シングルクォーテーションに逃れ、二重引用符'"'
  5. そして同封してLA階にシングルクォーテーションbashの場合、ダブルクォートのためにssh:'"ラ物語"'

と見よ!お風とこと:

rsync -ave ssh '"Louis Theroux"''"'"'"'"''"s LA Stories"'

するがひどくためにさすがに調度品等は古くなっ'--がありま

をネストされた引用のあまりに多くの層の問題を解決する別の方法:

あなたはあまりにも小さなスペースにあまりにも多くを詰め込むので、bashの機能を使用しようとしている。

問題は、ネストあまりにも多くのレベルを持ってしようとしているし、基本的なエイリアス技術が収容できるほど強力ではありません。単一、二重引用符は、ダニをバックアップし、パラメータに渡されたので、それを作るために、このようなbashの機能を使用して、すべて正常に我々が期待通りに処理されます:

lets_do_some_stuff() {
    tmp=$1                       #keep a passed in parameter.
    run_your_program $@          #use all your passed parameters.
    echo -e '\n-------------'    #use your single quotes.
    echo `date`                  #use your back ticks.
    echo -e "\n-------------"    #use your double quotes.
}
alias foobarbaz=lets_do_some_stuff

次に、あなたの$ 1と$ 2つの変数と単一、二重引用符を使用して戻って自分の整合性を台無しエイリアス機能を気にせずに刻みことができます。

このプログラムを印刷ます:

el@defiant ~/code $ foobarbaz alien Dyson ring detected @grid 10385
alien Dyson ring detected @grid 10385
-------------
Mon Oct 26 20:30:14 EDT 2015
-------------
shell_escape () {
    printf '%s' "'${1//\'/\'\\\'\'}'"
}

実施の説明:

  • ダブルクォートしやすいように出力包装シングルクォーテーションを使用し ${...} 書式

  • bashの検索と置き換え次のように記述されています。 ${varname//search/replacement}

  • 我々交換 ''\''

  • '\'' を符号化シングル ' このように:

    1. ' 末端の単一の引用

    2. \' を符号化 ' (バックスラッシュが必要なのではない内部のクォート)

    3. ' 開始まで単一の引用も

    4. bashを自動的に文字列を連結のない空白を間に

  • \ 前毎 \' のための脱出ルール ${...//.../...} .

string="That's "'#@$*&^`(@#'
echo "original: $string"
echo "encoded:  $(shell_escape "$string")"
echo "expanded: $(bash -c "echo $(shell_escape "$string")")"

P.S.常にエンコードを単一の引用文字列になるような簡単なよりダブル引用文字列です。

あなたはGNUパラレルは、あなたが使用することができますインストールされている場合はその引用内部ます:

$ parallel --shellquote
L's 12" record
<Ctrl-D>
'L'"'"'s 12" record'
$ echo 'L'"'"'s 12" record'
L's 12" record

バージョン20190222からあなたも複数回--shellquoteすることができます:

$ parallel --shellquote --shellquote --shellquote
L's 12" record
<Ctrl-D>
'"'"'"'"'"'"'L'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'s 12" record'"'"'"'"'"'"'
$ eval eval echo '"'"'"'"'"'"'L'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'s 12" record'"'"'"'"'"'"'
L's 12" record

これは、すべてのサポートされているシェル(bashだけではなく)で文字列をクォートします。

この機能ます:

quote () 
{ 
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}

'内部'の引用できます。このよう使用します。

$ quote "urxvt -fg '#111111' -bg '#111111'"
'urxvt -fg '\''#111111'\'' -bg '\''#111111'\'''

引用のラインが、より複雑になり、単一引用符と混合して二重引用符のように、それは変数の内部で引用する文字列を取得するにはかなりトリッキーになることがあります。このようなケースが現れたとき、あなたは(これに類似)スクリプト内で引用する必要がある正確な行を記述します。

#!/bin/bash

quote ()
{
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}

while read line; do
    quote "$line"
done <<-\_lines_to_quote_
urxvt -fg '#111111' -bg '#111111'
Louis Theroux's LA Stories
'single quote phrase' "double quote phrase"
_lines_to_quote_

ウィル出力ます:

'urxvt -fg '\''#111111'\'' -bg '\''#111111'\'''
'Louis Theroux'\''s LA Stories'
''\''single quote phrase'\'' "double quote phrase"'

すべて正しく単一引用符内の文字列を引用符で囲まれます。

明らかにしやすくなるだけで囲む二重引用符ものに挑戦す。ここではその答えだけでシングルクォーテーション.私が使っている変数の代わりに alias このやりながら印刷証明するものと同じを使用 alias.

$ rxvt='urxvt -fg '\''#111111'\'' -bg '\''#111111'\'
$ echo $rxvt
urxvt -fg '#111111' -bg '#111111'

説明

のであり、単一引用符を再開していくことをお勧めしています。例えば、 foo='a''b' と同じ foo='ab'.できるのであり、単一引用符、文字通りの単一引用符 \', 、その後再開し、次のシングルお見積させていただきます。

内訳図

この図が明確で使用ブラケットにはシングルクォーテーションは開閉選択式です。お見積もりはない"入れ子"のように括弧ができます。きものの色を強調が正しく適用されます。の引用文字列はマルーンは、 \' はブラック。

'urxvt -fg '\''#111111'\'' -bg '\''#111111'\'    # original
[^^^^^^^^^^] ^[^^^^^^^] ^[^^^^^] ^[^^^^^^^] ^    # show open/close quotes
 urxvt -fg   ' #111111  '  -bg   ' #111111  '    # literal characters remaining

(これは基本的に同じ答えとしてAdrianのような気がこもります。また彼の答えは2ない不要なシングルクォーテーションを終了いたします。)

ここでもう一つの解決策です。この機能は、投票の答えは、上記の説明と同様に、単一の引数を取り、適切に単一引用符を使用して、それを引用します。

single_quote() {
  local quoted="'"
  local i=0
  while [ $i -lt ${#1} ]; do
    local ch="${1:i:1}"
    if [[ "$ch" != "'" ]]; then
      quoted="$quoted$ch"
    else
      local single_quotes="'"
      local j=1
      while [ $j -lt ${#1} ] && [[ "${1:i+j:1}" == "'" ]]; do
        single_quotes="$single_quotes'"
        ((j++))
      done
      quoted="$quoted'\"$single_quotes\"'"
      ((i+=j-1))
    fi
    ((i++))
  done
  echo "$quoted'"
}

だから、あなたはそれをこのように使用することができます:

single_quote "1 2 '3'"
'1 2 '"'"'3'"'"''

x="this text is quoted: 'hello'"
eval "echo $(single_quote "$x")"
this text is quoted: 'hello'

あなたは、PythonやPython 2 3内殻文字列を生成している場合は、次のように引数を引用するのに役立つことがあります:

#!/usr/bin/env python

from __future__ import print_function

try:  # py3
    from shlex import quote as shlex_quote
except ImportError:  # py2
    from pipes import quote as shlex_quote

s = """foo ain't "bad" so there!"""

print(s)
print(" ".join([shlex_quote(t) for t in s.split()]))

この意志出力ます:

foo ain't "bad" so there!
foo 'ain'"'"'t' '"bad"' so 'there!'
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top