Câu hỏi này không phải là về cách viết một chuỗi ký tự thoát đúng. Tôi không thể tìm thấy bất kỳ câu hỏi liên quan nào không phải là về cách thoát các biến để tiêu thụ trực tiếp trong một tập lệnh hoặc bởi các chương trình khác.
Mục tiêu của tôi là cho phép một tập lệnh tạo các tập lệnh khác. Điều này là do các tác vụ trong các tập lệnh được tạo sẽ chạy bất kỳ nơi nào từ 0 đến n lần trên một máy khác và dữ liệu mà chúng được tạo có thể thay đổi trước khi chúng chạy (một lần nữa), do đó, thực hiện các thao tác trực tiếp, qua mạng sẽ không làm việc.
Đưa ra một biến đã biết có thể chứa các ký tự đặc biệt như dấu ngoặc đơn, tôi cần viết nó ra dưới dạng một chuỗi ký tự thoát hoàn toàn, ví dụ: một biến foo
chứa bar'baz
sẽ xuất hiện trong tập lệnh được tạo như:
qux='bar'\''baz'
mà sẽ được viết bằng cách nối thêm "qux=$foo_esc"
các dòng script khác. Tôi đã làm nó bằng cách sử dụng Perl như thế này:
foo_esc="'`perl -pe 's/('\'')/\\1\\\\\\1\\1/g' <<<"$foo"`'"
nhưng điều này có vẻ như quá mức cần thiết.
Tôi đã không thành công khi làm điều đó với bash một mình. Tôi đã thử nhiều biến thể trong số này:
foo_esc="'${file//\'/\'\\\'\'}'"
foo_esc="'${file//\'/'\\''}'"
nhưng dấu gạch chéo xuất hiện trong đầu ra (khi tôi thực hiện echo "$foo"
) hoặc chúng gây ra lỗi cú pháp (mong đợi thêm đầu vào nếu được thực hiện từ trình bao).
alias "varname=$varname" varname
hoặcvar=value set
alias
và / hoặcset
khá phổ biến