2016-11-13 18 views
7

Tôi muốn in các bổ sung của một hàm vào một tệp. Tôi được nghe kể một câu lệnh printf "% q", có hướng dẫn là sau đây,Làm thế nào để sử dụng printf "% q" trong bash?

# man printf 
%q  ARGUMENT is printed in a format that can be reused as shell input, escaping non-print‐ 
      able characters with the proposed POSIX $'' syntax. 

Trên cơ sở hướng dẫn ở trên, tôi đã cố gắng sau mã.

#!/bin/bash 
# file name : print_out_function_augs.sh 

output_file='output.txt' 

function print_augs() { 
    printf "%q " "[email protected]" >> "${output_file}" 
    echo >> "${output_file}" 
} 

print_augs a 'b c' 

cat "${output_file}" 
rm "${output_file}" 

và chạy

bash print_out_function_augs.sh 

Các kết quả được như sau,

a b\ c 

tôi mong đợi kết quả như

a 'b c' 

là augments gốc để print_augs chức năng.

Tại sao đầu ra và tăng cường ban đầu lại khác nhau? Hoặc tôi có thể in ra các bản tăng cường ban đầu như chúng được không?

Cảm ơn bạn rất nhiều.

Trả lời

6

Gấu này trong tâm trí khi sử dụng %q:

LUAÄN được in trong một định dạng có thể được tái sử dụng như vỏ đầu vào, thoát ký tự không thể in được với dự án xây POSIX $ '' cú pháp.

Mỏ nhấn mạnh. printf là miễn phí để định dạng lại các đối số theo bất kỳ cách nào nó thích miễn là đầu vào có thể được sử dụng lại trong vỏ. Tuy nhiên, đây không phải là lý do khiến đầu vào của bạn trông như thế.

Trong Bash ký tự ' là dấu tách chuỗi, là cách bạn nói bash "chuỗi sau chứa các ký tự đặc biệt như dấu cách và các ký tự đặc biệt này không được phân tích cú pháp bởi Bash". Các dấu ngoặc kép không được chuyển đến các lệnh được gọi. Có gì lệnh nhìn thấy là một cái gì đó như thế này:

Command: 
    printf "%q" a 'b c' 

Received args: 
    printf::arg0: printf 
    printf::arg1: %q 
    printf::arg2: a 
    printf::arg3: b c 

Lưu ý rằng arg3 không có dấu ngoặc kép xung quanh nó. Bash không vượt qua chúng.

Khi printf in args ra, nó không biết rằng có dấu ngoặc kép quanhb c, vì vậy nó không in chúng. Nhưng nó không biết rằng khoảng cách giữa 'b' và 'c' là một ký tự đặc biệt, và đặt \ ở phía trước để thoát nó.

Điều này đúng với tất cả các chức năng/lệnh bash, vì vậy hãy nhớ rằng điều tương tự cũng xảy ra khi bạn gọi số print_augs.

Nếu bạn muốn duy trì dấu ngoặc kép quanh chuỗi của bạn, bạn sẽ cần phải tăng gấp đôi trích dẫn họ để Bash không phân tích chúng:

function print_augs2() { 
    echo "[email protected]" >> "${output_file}" 
} 

print_augs2 a "'b c'" 

# Output: a 'b c' 
+0

cảm ơn bạn đã giải thích chi tiết và giải pháp. Tôi không thể tưởng tượng '\' trong 'b \ c'. là một nhân vật thoát. – mora

Các vấn đề liên quan