In một chuỗi bao gồm dấu ngoặc đơn và các ký tự đặc biệt khác


8

Làm thế nào tôi có thể viết chính xác với một tập lệnh AIX? Yêu cầu của tôi là viết lệnh này trong test.txt:

clock=$(prtconf -s | awk '{print $4,$5}')

Tôi đã thử lệnh này:

print 'clock=$(prtconf -s | awk '{print $4,$5}')' > test.txt

Đầu ra được viết bằng test.txt cho tôi:

clock=$(prtconf -s | awk {print ,})

Nếu tôi sử dụng " "dấu ngoặc kép:

print "clock=$(prtconf -s | awk '{print $4,$5}')"

Nó cho tôi trực tiếp đến:

clock=3612 MHz

Làm sao tôi có thể giải quyết việc này?


Bạn có nghĩa là bạn muốn sử dụng clock=$(prtconf -s | awk '{print $4,$5}')biểu thức trong awktuyên bố?
cuonglm

Câu trả lời:


4

Bạn cần tiếp tục sử dụng các trích dẫn đơn, nhưng sau đó in ra những trích dẫn bạn cần trong đầu ra "riêng biệt" hoặc sử dụng dấu ngoặc kép và thoát khỏi các ký hiệu đô la.

Đối với tùy chọn thứ hai:

print "clock=\$(prtconf -s | awk '{print \$4,\$5}')" > test.txt

Đối với người đầu tiên:

print 'clock=$(prtconf -s | awk '\''{print $4,$5}'\'')' > test.txt

(Đó là của 'text'sau đó trốn thoát báo giá duy nhất \'sau đó 'other text'.)

Để hoàn thiện, hãy lưu ý rằng printmở rộng các chuỗi thoát ký tự dấu gạch chéo ngược (điều này không quan trọng trong trường hợp của bạn vì chuỗi bạn muốn in không chứa bất kỳ dấu gạch chéo ngược nào). Để tránh điều này, sử dụng print -r.


Trừ khi tôi hiểu nhầm câu hỏi, OP muốn lệnh được in trong tệp văn bản chứ không phải kết quả (nếu đó là kết quả, lần thử thứ hai của họ chỉ thiếu một cặp dấu ngoặc kép).
Mat

Oh, xin lỗi, đọc sai của tôi, xóa bình luận.
cuonglm

4

Cách đơn giản để làm điều đó là sử dụng các trích dẫn đơn '…'xung quanh chuỗi. Các trích dẫn đơn phân định một chuỗi ký tự, vì vậy bạn có thể đặt bất cứ thứ gì giữa chúng trừ một trích dẫn '. Để chèn một trích dẫn trong chuỗi, sử dụng chuỗi bốn ký tự '\''(trích dẫn đơn, dấu gạch chéo ngược, trích dẫn đơn, trích dẫn đơn).

Về mặt kỹ thuật, không có cách nào để đặt một trích dẫn bên trong một chữ được trích dẫn. Tuy nhiên, nghĩa đen liên tiếp chỉ tốt như một chữ duy nhất. 'foo'\''bar'được phân tích thành

  1. nghĩa đen foo
  2. các ký tự chữ trích dẫn dấu gạch chéo ngược '
  3. nghĩa đen bar

Điều này có nghĩa là đó '\''là một cách để thoát khỏi một trích dẫn trong một nghĩa đen được trích dẫn.

Lưu ý rằng printlệnh ksh thực hiện mở rộng dấu gạch chéo ngược. Thêm -rtùy chọn để tránh điều này. Nó sẽ không làm tổn thương bạn vì không có dấu gạch chéo ngược trong chuỗi bạn muốn in, nhưng sẽ tốt hơn khi sử dụng -r, trong trường hợp dấu gạch chéo ngược được thêm vào trong quá trình bảo trì.

print -r -- 'clock=$(prtconf -s | awk '\''{print $4,$5}'\'')' > test.txt

Ngoài ra, bạn có thể sử dụng phương thức POSIX để in một chuỗi theo nghĩa đen với một dòng mới ở cuối:

printf '%s\n' 'clock=$(prtconf -s | awk '\''{print $4,$5}'\'')' > test.txt

1

Có 2 giải pháp như @Mat đã nói.

1] Sử dụng trích dẫn đơn ': trích dẫn đơn này sẽ loại bỏ ý nghĩa đặc biệt của các ký tự thoát $, các lệnh khác nhau (về cơ bản là tất cả các cấu trúc bash & lệnh unix). printlệnh sẽ lấy mọi thứ dưới dạng các ký tự đơn giản và ghi điều này vào tệptest.txt

2] Sử dụng dấu ngoặc kép ": Ở đây chúng ta cần thoát một cách rõ ràng các cấu trúc bash. \$loại bỏ ý nghĩa đặc biệt của $, tức là giá trị của biến được sử dụng sau $.


1

Tại sao không chỉ sử dụng một tài liệu ở đây ?

cat <<'END' > test.txt
clock=$(prtconf -s | awk '{print $4,$5}')
END

Lưu ý các trích dẫn xung quanh ENDtrong <<'END': chúng có nghĩa là văn bản trong các dòng sau (cho đến khi ENDđánh dấu) sẽ được sử dụng theo nghĩa đen. Chỉ với <<ENDviệc mở rộng đô la (tức là $(command)hoặc $variable) sẽ được thực hiện.

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.