2012-03-01 8 views
11

私は上記バッシュネストされた引用符とはeval

argv="su -c '$RVM_PATH wrapper $config_rvm \'$PASSENGER_RVM_BIN $command $options\'' web" 
eval $argv 

bashスクリプト内難易ネストされた引用符を抱えている

eval: line 162: unexpected EOF while looking for matching `'' 
eval: line 163: syntax error: unexpected end of file 

答えて

12
argv="su -c \"$RVM_PATH wrapper $config_rvm \\\"$PASSENGER_RVM_BIN $command $options\\\"\" web" 
6

Use an array instead.

#!/bin/bash 
cmd=(echo "foo bar") 
"${cmd[@]}" 
+0

あなたが提供したリンクが推奨するbashアレイの使用方法を説明しているかどうかはわかりません。 –

+0

@TomHale:私の答えには構文のバグがありました。 –

9

てくれましたので、\' doesnの」一重引用符で囲まれた文字列内に特別な意味を持ちます。それは単純に「バックスラッシュとそれに続くストリングの終わり」を意味します。

1つのオプションは、'... 'の代わりに$'...'を使用することです。バックスラッシュエスケープを使用できるようになります。それは次のようになります。

argv="su -c $'$RVM_PATH wrapper $config_rvm \'$PASSENGER_RVM_BIN $command $options\'' web" 

欠点は$RVM_PATH$config_rvm、または他の変数のいずれかがバックスラッシュを含めることができることを万が一がある場合、それはあまりにもバックスラッシュエスケープを導入すると解釈することができることです。

関連する問題