0

私の(ba)shスクリプトには、たとえば次のようなものがあります。

MYVAR='Alice says: "Hello, Bob." But Bob isn't listening.'

isn't' inは単一引用符で囲まれた文字列を終了するため、これは構文エラーです。私はこれを使用して修正できることを知っています

MYVAR='Alice says: "Hello, Bob." But Bob isn'"'"'t listening.'

しかし、それはとても醜いです...代わりに何ができますか? sh はサポートしていません

MYVAR='Alice says: "Hello, Bob." But Bob isn\'t listening.'

これは許容範囲であり、二重引用符文字列に切り替えることは私にとって選択肢ではありません。

4

5 に答える 5

3

いいえ、Bash (または korn シェル) では、単一引用符で囲まれた文字列内に単一引用符を埋め込むことはできません。これは、選択した言語の機能です。一重引用符の中に特殊文字はありません\

これはあなたのソリューションの1つのバリエーションであり、醜いです:

 echo 'Alice says: "Hello, Bob." But Bob isn'\''t listening.'

与えます:

Alice says: "Hello, Bob." But Bob isn't listening.

または、Perl や Python などの別の言語を使用してください。

于 2013-03-17T09:04:57.953 に答える
2

少なくとも bash でサポートされている非 POSIX ソリューションは次のとおりです。

MYVAR=$'Alice says: "Hello, Bob." But Bob isn\'t listening.'

$原因はエスケープ処理です。

于 2013-03-17T13:54:17.857 に答える
1

HEREDOC を使用することは、これに対処する良い方法です。

read MYVAR << \EOF
Alice says: "Hello, Bob." But Bob isn't listening.
EOF
于 2013-03-17T20:42:14.540 に答える
0

二重引用符とエスケープを使用することもできます。言語を変更するよりも簡単だと思います。

MYVAR="Alice says: \"Hello, Bob.\" But Bob isn't listening."

bashでのシンボルのエスケープに関する詳細情報。

于 2013-03-17T10:51:39.310 に答える
0

への切り替えがオプションである理由はわかりません$'...'が、二重引用符への切り替えはオプションではありません(おそらく、何らかのパラメーター展開を防ぐためです)。ただし、文字列全体を二重引用符で囲む必要はありません。

MYVAR='Alice says: "Hello, Bob." But Bob '"isn't"' listening.'
于 2013-03-17T14:17:45.027 に答える