Bạn luôn có thể hiển thị các hiệu ứng của trích dẫn biến với printf
.
Word chia nhỏ được thực hiện trên var1
:
$ var1="hello world"
$ printf '[%s]\n' $var1
[hello]
[world]
var1
trích dẫn, vì vậy không có từ chia tách:
$ printf '[%s]\n' "$var1"
[hello world]
Word chia nhỏ var1
bên trong $()
, tương đương với echo "hello" "world"
:
$ var2=$(echo $var1)
$ printf '[%s]\n' "$var2"
[hello world]
Không có từ tách var1
, không có vấn đề với việc không trích dẫn $()
:
$ var2=$(echo "$var1")
$ printf '[%s]\n' "$var2"
[hello world]
Word chia tách var1
một lần nữa:
$ var2="$(echo $var1)"
$ printf '[%s]\n' "$var2"
[hello world]
Trích dẫn cả hai, cách dễ nhất để chắc chắn.
$ var2="$(echo "$var1")"
$ printf '[%s]\n' "$var2"
[hello world]
Vấn đề toàn cầu
Không trích dẫn một biến cũng có thể dẫn đến việc mở rộng toàn cầu nội dung của nó:
$ mkdir test; cd test; touch file1 file2
$ var="*"
$ printf '[%s]\n' $var
[file1]
[file2]
$ printf '[%s]\n' "$var"
[*]
Lưu ý điều này xảy ra sau khi biến chỉ được mở rộng. Không cần thiết phải trích dẫn một quả địa cầu trong khi chuyển nhượng:
$ var=*
$ printf '[%s]\n' $var
[file1]
[file2]
$ printf '[%s]\n' "$var"
[*]
Sử dụng set -f
để vô hiệu hóa hành vi này:
$ set -f
$ var=*
$ printf '[%s]\n' $var
[*]
Và set +f
để kích hoạt lại nó:
$ set +f
$ printf '[%s]\n' $var
[file1]
[file2]