Trong kịch bản shell, sự khác biệt giữa 2 là những gì khi gán một biến khác:Trích dẫn vs không trích dẫn biến trên RHS của biến phân
a=$b
và
a="$b"
và khi Tôi có nên sử dụng cái này qua cái kia không?
Trong kịch bản shell, sự khác biệt giữa 2 là những gì khi gán một biến khác:Trích dẫn vs không trích dẫn biến trên RHS của biến phân
a=$b
và
a="$b"
và khi Tôi có nên sử dụng cái này qua cái kia không?
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 .
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
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).
Dưới đây là một số ví dụ khác: (có hai tập tin trong thư mục hiện t.sh
và file
)
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"
..
Đâ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
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. –
Bạn sẽ giới thiệu hướng dẫn nào? –