2012-03-01 39 views
11

Tôi đang gặp khó khăn trong lồng dấu ngoặc kép trong một kịch bản bashdấu ngoặc kép Bash lồng và eval

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

Trên đây đã cho tôi

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

Trả lời

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

Tôi không chắc chắn liên kết bạn đã cung cấp thảo luận về việc sử dụng mảng bash được đề xuất của bạn hay không. –

+0

@TomHale: Câu trả lời của tôi có lỗi cú pháp. –

9

Đó là bởi vì \' doesn' t có bất kỳ ý nghĩa đặc biệt nào trong một chuỗi được trích dẫn đơn; nó có nghĩa là chỉ đơn giản là "dấu gạch chéo ngược, tiếp theo là kết thúc chuỗi".

Một tùy chọn là sử dụng $'...' thay vì '... '; điều đó sẽ cho phép bạn sử dụng dấu gạch chéo ngược. Nó sẽ giống như thế này:

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

Nhược điểm là nếu có bất kỳ cơ hội mà $RVM_PATH, $config_rvm, hoặc bất kỳ của các biến khác có thể bao gồm một dấu gạch chéo, sau đó nó cũng có thể được hiểu là giới thiệu một dấu chéo ngược-thoát.

Các vấn đề liên quan