Làm thế nào để lặp lại `một trích dẫn 'khi sử dụng một trích dẫn để bọc các ký tự đặc biệt trong vỏ?


26

Tôi đang đọc hướng dẫn về shell ngày hôm nay từ http://www.tutorialspoint.com/unix/unix-quote-mechanests.htmlm

Trong đó nó đề cập:

Nếu một trích dẫn xuất hiện trong một chuỗi được xuất ra, bạn không nên đặt toàn bộ chuỗi trong các trích dẫn đơn thay vào đó bạn nên sử dụng dấu gạch chéo ngược () như sau:

echo 'It\'s Shell Programming'

Tôi đã thử điều này trên máy chủ centos của tôi, nó không hoạt động, một >lời nhắc ra gợi ý cho tôi gõ thêm.

Tôi đã tự hỏi, vì hai trích dẫn đơn biến mọi ký tự đặc biệt thành các ký tự bình thường, bao gồm ký hiệu thoát \, nhưng loại trừ chính nó ',
làm thế nào tôi nên biểu thị một trích dẫn 'trong một cụm từ được trích dẫn?


1
Tại sao không sử dụng echo It\'s Shell Programminghay echo "It's Shell Programming"?
cuonglm

@cuonglm, vì tôi có thể sử dụng cụm từ nhưecho Wow, I'm going to have lots of $$$$$$ now
Zen

2
Vì vậy, bạn nên sử dụng dấu ngoặc kép, và thoát $, quá. Một cái gì đó giống echo Wow, I\'m going to have lots of \$\$\$\$\$\$ nowhoặc chỉecho Wow, I\'m going to have lots of '$$$$$$' now
cuonglm

@cuonglm, vâng, tôi có thể làm được, và tôi biết làm thế nào tôi có thể làm được. Nhưng hướng dẫn mà tôi đã đọc dường như tự tin về việc có một cách để thoát khỏi trích dẫn đơn trong các cụm từ được trích dẫn, nhưng ví dụ đưa ra của hướng dẫn không hoạt động. Vì vậy, tôi tự hỏi ai đó có thể biết giải pháp.
Zen

1
Còn cái này thì sao? echo 'It'"'"'s Shell Programming'. Tôi chỉ chia nó thành 3 chuỗi, chuỗi đầu tiên và cuối cùng được bao quanh bởi các dấu ngoặc đơn, nhưng chuỗi giữa có một trích dẫn được bao quanh bởi dấu ngoặc kép.
jcbermu

Câu trả lời:


49

Hướng dẫn sai.

POSIX nói:

Một trích dẫn không thể xảy ra trong dấu ngoặc đơn.

Đây là một số lựa chọn thay thế:

echo $'It\'s Shell Programming'  # ksh, bash, and zsh only, does not expand variables
echo "It's Shell Programming"   # all shells, expands variables
echo 'It'\''s Shell Programming' # all shells, single quote is outside the quotes
echo 'It'"'"'s Shell Programming' # all shells, single quote is inside double quotes

Đọc thêm: Báo giá - Wiki của Greg


4
Thêm một điều nữa: echo 'It''s Shell Programming'- zsh với rc_quotesbộ tùy chọn (và cả vỏ RC) - một cặp dấu ngoặc đơn bên trong dấu ngoặc đơn biểu thị một dấu ngoặc đơn.
Michał Politowski

5
Tôi đôi khi sử dụng q="'"qq='"'để làm cho sạch hơn. Điều này sau đó cho phép echo "It${q}s ${qq}Shell Programming${qq}"(dấu ngoặc nhọn là cần thiết cho các chữ cái đuôi). POSIX-an toàn. Lớp ngoài phải được trích dẫn kép.
Adam Katz

1

Bạn có thể dùng:

sed "s/'"'/&\\&&/g
     s/.*/'"'&'"'/
' <<IN
$arbitrary_value
IN

Để vỏ an toàn trích dẫn một dòng giá trị trên mỗi dòng.

Shell tùy thuộc, bạn cũng có thể có tùy chọn để làm:

printf %q\\n "$arbitrary_value"

Mặc dù tôi thường thích làm:

a=$(alias "a=$arbitrary_value" a); a=${a#*=}

Một cách tiếp cận thủ công hơn có thể trông giống như:

sq(){ set \' "$1"
      while case $2 in (*\'*) :;;
      (*) ! RETURN="$1$2'"     ;;esac
      do  set "$1${2%%\'*}'\''" "${2#*\'}"
      done
}

... ít nhất là không có ngã ba.


1
Tôi hoàn toàn không biết bạn đang nói về điều gì, ngoại trừ cụm từ printf %q\\n "$arbitrary_value", những người khác quá phức tạp.
Zen

1

Trong trường hợp có người khác xuất hiện để đưa hỗn hợp dấu ngoặc đơn và dấu ngoặc kép vào một tệp, thì điều này cũng hoạt động:

cat > its-shell-programing.txt << __EOF__
echo $'It\'s Shell Programming'
echo "It's Shell Programming"
echo 'It'\''s Shell Programming'
echo 'It'"'"'s Shell Programming'
__EOF__

Tất cả mọi thứ mà shell có thể xem là một biến mặc dù phải thoát bằng dấu gạch chéo ngược:

cat >> its-shell-programing.txt << __EOF__
echo \$It\'s Shell Programming
__EOF__
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.