Có cách nào để thoát dấu ngoặc đơn trong shell không?


11

Ví dụ. tôi muốn nói rằng

perl -e 'print '"'"'Hello, world!'"'"', "\n";'

Có một cách ít khó xử hơn để làm điều đó, ví dụ như thoát khỏi dấu ngoặc đơn?

Vâng, tôi biết rằng tôi có thể viết

perl -e 'print q[Hello, world!], "\n"'
perl -e 'print "Hello, world!\n"'

Nhưng câu hỏi này là về trích dẫn trong vỏ, không phải trong Perl.

Tôi quan tâm làm thế nào để làm điều đó trong bashcshở nơi đầu tiên.

Câu trả lời:


9

Dennis chỉ ra các lựa chọn thay thế thông thường trong câu trả lời của anh ấy (chuỗi đơn đôi, đôi đơn, chuỗi trích dẫn được nối với các trích dẫn đơn đã thoát; cho

Trong các vỏ giống như Bourne (sh, ksh, ash, dash, bash, zsh, v.v.) các chuỗi được trích dẫn là hoàn toàn theo nghĩa đen. Điều này giúp dễ dàng bao gồm các ký tự mà shell sẽ xử lý đặc biệt mà không cần phải thoát chúng, nhưng điều đó có nghĩa là bản thân ký tự trích dẫn không thể được bao gồm trong các chuỗi trích dẫn.

Tôi thậm chí từ chối nghĩ về các loại vỏ csh vì chúng hoàn toàn bị phá vỡ ở các khía cạnh khác (xem Lập trình Csh được coi là có hại ).


Cảm ơn bạn. "Điều này là không thể" - đó là câu trả lời mà tôi mong đợi :) Mặc dù tôi luôn hy vọng rằng đây là tài liệu dành riêng để đóng vai trò này.
codeholic

Không giống như trong Perl, shell giống như Bourne ở đây, các tài liệu chỉ hữu ích trực tiếp cho việc cung cấp đầu vào thông qua stdin. Tất nhiên, bạn có thể đặt dấu ngoặc đơn trong đó. Bạn cũng có thể bật "chế độ chữ" của tài liệu ở đây bằng cách trích dẫn từ: (ví dụ) blah <<\EOF … EOF. Bạn cũng có thể sử dụng <<'EOF'<<"EOF. Tất cả đều có nghĩa là tài liệu ở đây (không giống như Perl). Nếu bạn đã thực sự quyết tâm, bạn có thể làm blah "$(cat<<\EOF … EOF )" other args(sử dụng dòng mới nơi tôi đã viết khoảng trắng trong thay thế lệnh; ksh và zsh có thể làm mà không cần con mèo , những người khác cần nó). Nhưng nó sẽ thực sự có giá trị nó?
Chris Johnsen

Chỉ muốn lưu ý rằng dấu ngoặc đơn zsh không hoàn toàn bằng chữ. Zsh sẽ cố gắng diễn giải '\ U' ở bất cứ đâu trong một chuỗi trích dẫn đơn dưới dạng mã ký tự, ví dụ: echo '\U0000068\U000069'tiếng vang 'hi'. Không chắc chắn tại sao mặc dù trừ khi đó là một lỗi trong vỏ.
Matthew

1
@Matthew: Việc giải thích \Utrong trường hợp đó đang được thực hiện bằng lệnh echo tích hợp (hành vi này có thể được kiểm soát bởi -Ehoặc tùy chọn BSD_ECHO và -e). Bạn có thể thấy rằng chuỗi ký tự được thông qua (và không được giải thích theo cách khác) trong các lệnh khác; ví dụ printf %s\\n '\U0000068\U000069'.
Chris Johnsen

@ChrisJohnsen Cảm ơn, tôi mới biết về zsh và không nhận ra điều này nhưng bạn đã đúng. Trang man nói với tôi -e là mặc định nhưng zsh phải ghi đè lên điều đó.
Matthew

5

Đối với tôi, tất cả các ví dụ của bạn tạo ra:

Chào thế giới!

Và điều này cũng vậy:

perl -e 'print "Hello, world!", "\n";'

Và điều này:

perl -e 'print '\''Hello, world!'\'', "\n";'

Bạn có thể làm rõ những gì bạn đang cố gắng làm?

Trong shell, chẳng hạn như Bash, nếu bạn muốn in dấu ngoặc kép như một phần của chuỗi, một loại dấu ngoặc kép sẽ thoát khỏi dấu ngoặc kép khác.

$ echo '"Hello, world!"'
"Hello, world!"
$ echo "'Hello, world!'"
'Hello, world!'

Biên tập:

Đây là một cách khác:

$ perl -e 'print "\047Hello, world!\047", "\n";'
'Hello, world!'
$ echo -e "\047Hello, world! \047"
'Hello, world! '

Khoảng trắng sau dấu chấm than sẽ tránh được lỗi mở rộng lịch sử. Tôi có thể đã làm set +Hthay thế.


1

Không chắc chắn nếu chỉnh sửa của tôi cho câu trả lời trước sẽ hiển thị:

Dán giống như một câu trả lời mới:

Phương pháp thay thế:

Khi tôi thử giải pháp của bạn, tôi vẫn không thể in được.

Nhưng tôi đã lấy gợi ý từ giải pháp của bạn và đã thử như sau:

$ perl -e '$foo = chr(39); print "${foo}Hello, world ${foo}", "\n";'
'Hello, world '

Giá trị ASCII của 'là 39.

Tôi cần điều này để thực hiện chỉnh sửa nội tuyến thành một loạt các tệp để thêm 'tại một địa điểm ưa thích.


1

Tài liệu ở đây là cách tốt nhất để không quan tâm đến việc trốn thoát:

$ cat <<EOF
my $var = "Hello";
print $text, ', world!', "\n";'
EOF

Bạn hoàn toàn có thể vô hiệu hóa tất cả các chuyến đi bằng cách sử dụng tài liệu được trích dẫn ở đây:

$ cat <<'EOF'
my $var = "Hello";
print $text, ', world!', "\n";'
EOF

Nếu bạn muốn truyền nó làm đối số thay vì đầu vào, bạn có thể sử dụng xargs:

$ xargs -0 <<'EOF' perl -e
my $var = "Hello";
print $text, ', world!', "\n";'
EOF

0

Tôi không biết nếu có tùy chọn để làm điều này trong bash, nhưng với zsh bạn có thể sử dụng ''sau khi bật RC_QUOTEStùy chọn. (Tôi khuyên bạn nên thử zsh; nó hầu như tương thích với bash và có thể giả lập bash để tương thích nhiều hơn.)

Với bash (và hầu hết thời gian với zsh), tôi chỉ sử dụng '\''vì nó dễ đọc hơn '"'"'.

Tôi hoàn toàn không biết làm thế nào để làm điều đó trong csh.


-1

Bạn có thể sử dụng \ 'và \ "để thoát dấu ngoặc kép bằng perl nếu được sử dụng nội bộ như một phần của tập lệnh perl. Tôi không chắc liệu dòng lệnh có chấp nhận điều đó hay không. Bạn có thể thử và xem nó có hoạt động không.


3
Nếu nó quá dễ, tôi sẽ không hỏi. Bạn có thể thử nó và xem nếu nó hoạt động trước khi đăng câu trả lời.
codeholic
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.