2012-03-01 12 views
11

mam trudności zagnieżdżone cytaty w skrypcie bashBash zagnieżdżone cytaty i eval

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

Powyższy załatwił mi

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

Odpowiedz

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

Nie jestem pewien, czy podany link omawia sugerowane użycie tablic Bash. –

+0

@TomHale: Moja odpowiedź zawiera błąd składni. –

9

To dlatego \' robi” • mają jakieś specjalne znaczenie w ciągu pojedynczego cudzysłowu; oznacza po prostu "ukośnik odwrotny, a następnie koniec łańcucha".

Jedną opcją jest użycie $'...' zamiast '... "; to pozwoli ci używać odwrotnych ukośników-ucieczek. to będzie wyglądać następująco:

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

Minusem jest to, że jeśli jest jakaś szansa, że ​​$RVM_PATH, $config_rvm, lub którykolwiek z pozostałych zmiennych może zawierać ukośnika, to też mogą być interpretowane jako wprowadzenie backslash-ucieczki.