Một script chạy đúng với report.txt nhưng lỗi khi gặp tên “bao cao thang.txt” thường không phải do Linux không hỗ trợ khoảng trắng. Nguyên nhân có thể là shell đã biến một giá trị thành nhiều đối số trước khi chương trình nhận được nó. Hiểu dấu nháy giúp tránh lỗi ngay từ cách truyền dữ liệu.
1. Bắt đầu bằng ví dụ chỉ in ra màn hình
Các ví dụ dành cho Bash với IFS mặc định; chạy trong phiên Bash thử nghiệm, không phải PowerShell hay mọi loại shell. Không cần tạo file có tên như ví dụ.
report_name='bao cao thang.txt'
printf '[%s]\n' $report_name
printf '[%s]\n' "$report_name"
Lệnh đầu được kỳ vọng in ba dòng: [bao], [cao], [thang.txt]. Lệnh thứ hai in một dòng [bao cao thang.txt]. Dấu nháy ở lúc gán biến không tự bảo vệ mọi lần sử dụng biến về sau.
2. Dấu nháy đơn và kép có vai trò khác nhau
Tài liệu Bash về quoting mô tả các cơ chế giữ nguyên ký tự. Dấu nháy đơn giữ chuỗi theo nghĩa đen; dấu nháy kép vẫn cho phép mở rộng biến. Với một biến chứa tên file, thông thường bạn muốn lấy giá trị của biến nhưng giữ nó thành một đối số.
printf '%s\n' '$report_name'
printf '%s\n' "$report_name"
Dòng đầu in tên biến có dấu $, dòng sau in giá trị. Đừng thêm nháy đơn quanh biểu thức biến khi mục tiêu là đọc giá trị của nó.
3. Không chỉ có khoảng trắng
Theo quy tắc word splitting, kết quả mở rộng biến không được đặt trong nháy kép có thể bị tách từ. Trong ngữ cảnh đối số thông thường, các ký tự mẫu tên file như * cũng có thể được mở rộng thành những tên khớp trong thư mục. Bởi vậy, thử nghiệm chỉ với tên ngắn chưa đủ.
Khi dữ liệu là một đường dẫn, truyền "$report_name" giúp giữ giá trị thành một đối số. Nhưng dấu nháy không kiểm tra file có tồn tại, không cấp quyền truy cập và không bảo đảm đường dẫn nằm trong thư mục được phép. Những kiểm tra đó vẫn là trách nhiệm của script.
4. Nhiều đường dẫn nên dùng mảng
reports=('bao cao thang.txt' 'ghi chu.txt')
printf '[%s]\n' "${reports[@]}"
Kỳ vọng là hai dòng, mỗi dòng tương ứng một phần tử. Không ghép tất cả đường dẫn vào một chuỗi rồi trông chờ shell tự tách đúng, nhất là khi tên có khoảng trắng. Cú pháp mảng này là của Bash; không chạy script bằng sh rồi giả định vẫn tương thích.
5. Checklist trước khi dùng với lệnh thật
- Thử tên có khoảng trắng, ký tự Unicode và ký tự * theo nghĩa đen.
- Thử biến rỗng và xác định rõ phải báo lỗi hay chấp nhận giá trị rỗng.
- Với chương trình hỗ trợ, dùng -- để kết thúc tùy chọn trước đường dẫn có thể bắt đầu bằng dấu gạch ngang.
- Không dùng eval để “sửa” vấn đề dấu nháy; đừng biến dữ liệu thành mã lệnh.
- Chỉ chuyển từ ví dụ printf sang thao tác ghi hoặc xóa sau khi xác định đúng từng đối số và phạm vi tác động.
Quy tắc dễ nhớ: một giá trị là một đối số thì đặt phần mở rộng biến trong nháy kép; nhiều giá trị độc lập thì dùng cấu trúc lưu từng phần tử. Viết rõ cách truyền dữ liệu giúp script dễ đọc và dễ kiểm thử hơn.




Chưa có bình luận. Hãy là người đầu tiên chia sẻ ý kiến.