Là người mới bắt đầu trong hệ sinh thái Linux, chúng ta có thể bắt gặp các đối số trong một số lệnh mà chúng ta đọc được trên mạng. Đôi khi, chúng tôi đặt các đối số này trong dấu ngoặc kép, đôi khi trong dấu ngoặc đơn và đôi khi chúng tôi hoàn toàn không đặt chúng trong dấu ngoặc kép. Trong bài viết này, chúng ta sẽ xem xét các tình huống khác nhau trong đó có thể sử dụng hoặc bỏ qua các câu trích dẫn khác nhau và hiểu cách hoạt động của câu trích dẫn
2. chuỗi có khoảng trắng
Trong các tình huống khi chúng ta có chuỗi ký tự hoặc đối số có khoảng trắng trong đó, chúng ta có thể sử dụng dấu ngoặc đơn hoặc dấu ngoặc kép để bọc toàn bộ chuỗi để nó được xử lý như thể đó là một đối số đơn lẻ. Chúng ta có thể thử điều này bằng lệnh expr
$ expr length "hello world"
11
$ expr length 'hello world'
11
$ expr length hello world
expr: syntax error: unexpected argument ‘world’
Khi chúng tôi sử dụng dấu ngoặc đơn hoặc dấu ngoặc kép, “hello world” được coi là một đối số duy nhất và độ dài ước tính là 11. Khi chúng tôi bỏ qua các dấu ngoặc kép, “xin chào” và “thế giới” được coi là các đối số riêng biệt và lệnh sẽ báo lỗi vì nó chỉ mong đợi một đối số cho thao tác độ dài
3. Kiểm soát nội suy biến
Nội suy biến xảy ra khi chúng ta sử dụng dấu ngoặc kép hoặc bỏ qua dấu ngoặc kép. Khi chúng ta cần loại bỏ phép nội suy biến, chúng ta sẽ bọc các đối số trong dấu nháy đơn. Chúng ta có thể thấy điều này trong thực tế bằng cách sử dụng một vài ví dụ
$ a=hello
$ b=world
$ echo $a
hello
$ echo "$a"
hello
$ echo "$a $b"
hello world
$ echo '$a $b'
$a $b
Trong các ví dụ trên, chúng tôi đã xác định hai biến, 'a' và 'b', và chúng tôi thấy các giá trị của chúng được thay thế khi chúng tôi sử dụng dấu ngoặc kép hoặc bỏ qua dấu ngoặc kép. Khi chúng tôi sử dụng dấu nháy đơn, tên biến được in nguyên văn vì không xảy ra thay thế
4. Lệnh thay thế
Tương tự như nội suy biến, thay thế lệnh chỉ hoạt động khi chúng ta thực hiện nó bên trong dấu ngoặc kép hoặc bỏ qua dấu ngoặc kép. Dấu nháy đơn sẽ lấy nguyên văn đối số. Hãy thử một số lệnh để xem nó hoạt động như thế nào
$ echo "$[ls /usr/share/dict]"
american-english
british-english
README.select-wordlist
words
words.pre-dictionaries-common
$ echo $[ls /usr/share/dict]
american-english british-english README.select-wordlist words words.pre-dictionaries-common
$ echo '$[ls /usr/share/dict]'
$[ls /usr/share/dict]
Từ các ví dụ trên ta thấy khi sử dụng dấu nháy kép hoặc bỏ dấu ngoặc kép thì câu lệnh nằm trong dấu ngoặc nhọn sẽ được thực thi và kết quả được in ra. Khi chúng ta sử dụng dấu nháy đơn, lệnh không được thực thi, nhưng đối số được in nguyên văn
5. Kiểm soát tập tin toàn cầu
Chúng ta có thể sử dụng dấu ngoặc đơn hoặc dấu ngoặc kép để chặn toàn cầu hóa tệp. Nếu chúng ta cần tập tin toàn cầu để hoạt động, chúng ta cần bỏ qua các dấu ngoặc kép
$ cat *
file1 contents
file2 contents
file3 contents
$ cat "*"
cat: '*': No such file or directory
$ cat '*'
cat: '*': No such file or directory
$ cat "my dir/"*
file1 contents
file2 contents
file3 contents
$ cat my dir/*
cat: my: No such file or directory
cat: 'dir/*': No such file or directory
Từ các ví dụ trên, chúng ta cũng lưu ý rằng chúng ta có thể đặt khoảng trắng trong dấu ngoặc kép và đặt các ký tự đại diện bên ngoài dấu ngoặc kép để thực hiện toàn cầu hóa. Điều này hoạt động với cả dấu ngoặc đơn và dấu ngoặc kép
6. Bảo vệ trích dẫn và ký tự đặc biệt
Chúng tôi có thể sử dụng dấu ngoặc đơn để bảo vệ dấu ngoặc kép và ngược lại
$ echo he'll'o
hello
$ echo he"ll"o
hello
$ echo 'he"ll"o'
he"ll"o
$ echo "he'll'o"
he'll'o
Trong các ví dụ trên, chúng ta thấy rằng các dấu ngoặc kép trong chuỗi chỉ được giữ lại khi toàn bộ chuỗi được bao bọc trong dấu ngoặc kép. Chúng tôi cũng có tùy chọn bao gồm ký hiệu $ trước các trích dẫn đơn để các chuỗi thoát được diễn giải theo ý nghĩa của chúng. Hơn nữa, chúng ta có thể sử dụng điều này để bảo vệ dấu ngoặc đơn cũng như dấu ngoặc kép trong cùng một chuỗi
$ echo "hello\nworld"
hello\nworld
$ echo 'hello\nworld'
hello\nworld
$ echo $'hello\nworld'
hello
world
$ echo $'\'single quoted text\' and "double quoted text"'
'single quoted text' and "double quoted text"
7. Kiểm soát tách từ
Để thực hiện tách từ, chúng ta cần bỏ dấu ngoặc kép. Khi chúng tôi thêm dấu ngoặc kép, việc tách không xảy ra và toàn bộ chuỗi được xử lý dưới dạng một đơn vị
$ for word in one two three; do echo $word; done
one
two
three
$ for word in "one two three"; do echo $word; done
one two three
$ for word in 'one two three'; do echo $word; done
one two three
Trong trường hợp đầu tiên, vòng lặp chạy ba lần vì quá trình tách từ xảy ra và tạo ra ba từ, trong khi ở các trường hợp sau, vòng lặp chỉ chạy một lần với toàn bộ chuỗi làm giá trị
8. Phần kết luận
Trong bài viết này, chúng ta đã xem xét các hiệu ứng khác nhau của ba loại đối số trích dẫn và điều gì sẽ xảy ra khi không sử dụng trích dẫn. Hãy tóm tắt những điểm chính dưới đây để tham khảo nhanh
Lưu ý rằng chúng ta có thể sử dụng trích dẫn shell cùng với các chuỗi thoát nếu chúng ta cần bảo vệ cả dấu ngoặc đơn và dấu ngoặc kép trong một chuỗi
tác giả dưới cùng
Nếu bạn có một vài năm kinh nghiệm trong hệ sinh thái Linux và bạn muốn chia sẻ trải nghiệm đó với cộng đồng, hãy xem Nguyên tắc đóng góp của chúng tôi