2010-10-18 37 views

Trả lời

2

Advanced Bash-Scripting Guide: Chapter 5: Quoting

Khi tham khảo một biến, nó là thường nên kèm theo tên của nó trong dấu ngoặc kép. Điều này ngăn không cho diễn giải lại tất cả các ký tự đặc biệt trong chuỗi được trích dẫn. Sử dụng dấu ngoặc kép để ngăn cách tách từ . Đối số được đính kèm trong các dấu ngoặc kép hiển thị chính nó dưới dạng một từ đơn , ngay cả khi nó chứa các dấu phân tách khoảng trắng .

+2

Đây là lời khuyên tốt nói chung, nhưng trong trường hợp cụ thể, đề cập đến OP, trích dẫn không phục vụ mục đích nào. – user000001

+0

Thật vậy, đây thường là lời khuyên tốt (và điều này gần như đáng ngạc nhiên từ ABS vì nó có xu hướng đưa ra những đề xuất ít hơn và bỏ qua thực hành tốt) nhưng không liên quan đến câu hỏi được hỏi. –

+0

Bạn sẽ giới thiệu hướng dẫn nào? –

4

Tôi nghĩ rằng không có sự khác biệt lớn ở đây. Có, nó được khuyến khích để kèm theo một biến trong ngoặc kép khi biến đó đang được tham chiếu. Tuy nhiên, $x dường như không được tham chiếu ở đây trong câu hỏi của bạn.

y=$x không tự nó ảnh hưởng đến cách xử lý các khoảng trắng. Chỉ khi nào $y thực sự được sử dụng để trích dẫn các vấn đề. Ví dụ:

$ x=" a b " 
$ y=$x 
$ echo $y 
a b 
$ echo "$y" 
a b 
4

Không có lý do (tốt) nào để báo giá gấp đôi RHS của bài tập thay đổi khi được sử dụng như một tuyên bố.

RHS của câu lệnh gán không bị chia tách từ (hoặc mở rộng cú đúp), v.v. vì vậy không thể cần báo giá để gán đúng. Tất cả các mở rộng khác (theo như tôi biết) xảy ra trên RHS nhưng cũng xảy ra trong ngoặc kép để trích dẫn không phục vụ mục đích nào.

Điều đó đang được nói có lý do không để báo giá RHS. Cụ thể là how to address error "bash: !d': event not found" in Bash command substitution (cụ thể xem câu trả lời của tôi và câu trả lời của rici).

2

Dưới đây là một số ví dụ khác: (có hai tập tin trong thư mục hiện t.shfile)

a='$(ls)'  # no command substitution 
b="$(ls)"  # command substitution, no word splitting 
c='*'   # no filename expansion 
d="*"   # no filename expansion 
e=*    # no filename expansion 
f=$a    # no expansions or splittings 
g="$a"   # no expansions or splittings 
h=$d    # no expansions or splittings 

echo ---'$a'--- 
echo $a   # no command substitution 
echo ---'$b'--- 
echo $b   # word splitting 
echo ---'"$b"'--- 
echo "$b"  # no word splitting 
echo ---'$c'--- 
echo $c   # filename expansion, word splitting 
echo ---'"$c"'--- 
echo "$c"  # no filename expansion, no word splitting 
echo ---'$d'--- 
echo $d   # filename expansion, word splitting 
echo ---'"$d"'--- 
echo "$d"  # no filename expansion, no word splitting 
echo ---'"$e"'--- 
echo "$e"  # no filename expansion, no word splitting 
echo ---'$e'--- 
echo $e   # filename expansion, word splitting 
echo ---'"$f"'--- 
echo "$f"  # no filename expansion, no word splitting 
echo ---'"$g"'--- 
echo "$g"  # no filename expansion, no word splitting 
echo ---'$h'--- 
echo $h   # filename expansion, word splitting 
echo ---'"$h"'--- 
echo "$h"  # no filename expansion, no word splitting 

Output:

---$a--- 
$(ls) 
---$b--- 
file t.sh 
---"$b"--- 
file 
t.sh 
---$c--- 
file t.sh 
---"$c"--- 
* 
---$d--- 
file t.sh 
---"$d"--- 
* 
---"$e"--- 
* 
---$e--- 
file t.sh 
---"$f"--- 
$(ls) 
---"$g"--- 
$(ls) 
---$h--- 
file t.sh 
---"$h"--- 
* 

Một điều thú vị cần ghi nhận là lệnh thay xảy ra trong biến các bài tập nếu chúng có dấu ngoặc kép và nếu RHS được cho rõ ràng là "$(ls)" và không ngầm là "$a" ..

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