2012-01-28 26 views
11

printf% q nên trích dẫn một chuỗi. Tuy nhiên, khi được thực thi thành một tập lệnh, nó sẽ xóa các dấu cách.

lệnh này:

printf %q "hello world" 

kết quả đầu ra:

hello\ world 

đó là chính xác.

kịch bản này:

#!/bin/bash 

str="hello world" 
printf %q $str 

kết quả đầu ra:

helloworld 

đó là sai.

Nếu hành vi như vậy thực sự được mong đợi, thay thế nào tồn tại trong tập lệnh để trích dẫn chuỗi có chứa bất kỳ ký tự nào theo cách nó có thể được dịch ngược lại thành chương trình gốc?

Cảm ơn.

phần mềm: GNU bash, phiên bản 4.1.5 (1) -release (i486-pc-linux-gnu)

sửa: Solved, cảm ơn.

+3

Removed tiền tố 'SOLVED' trong tiêu đề của bạn bài đăng. Trong StackOverflow.com, bạn không đánh dấu một vấn đề được giải quyết bằng cách thêm vào đầu đề với 'SOLVED' Bạn chấp nhận câu trả lời hoặc bạn đăng câu trả lời của riêng mình và chấp nhận câu trả lời bằng cách nhấp vào dấu chọn bên dưới các nút biểu quyết gần câu trả lời cho bạn. –

Trả lời

34

Bạn nên sử dụng:

printf %q "$str" 

Ví dụ:

[email protected]:~$ cat a.sh 
#!/bin/bash 

str="hello world" 
printf %q "$str" 
[email protected]:~$ ./a.sh 
hello\ world 

Khi bạn chạy printf %q $str, vỏ mở rộng nó để:

printf %q hello world 

Vì vậy, chuỗi helloworld là được cung cấp dưới dạng hai đối số riêng biệt cho printf lệnh và nó in hai đối số cạnh nhau.

Nhưng khi bạn chạy printf %q "$str", vỏ mở rộng nó để:

printf %q "hello world" 

Trong trường hợp này, chuỗi hello world được cung cấp như một đối số duy nhất cho lệnh printf. Đây là cái bạn muốn.

Dưới đây là một cái gì đó bạn có thể thử nghiệm với để chơi với các khái niệm:

[email protected]:~$ showargs() { echo "COUNT: $#"; printf "ARG: %s\n" "[email protected]"; } 
[email protected]:~$ showargs hello world 
COUNT: 2 
ARG: hello 
ARG: world 
[email protected]:~$ showargs "hello world" 
COUNT: 1 
ARG: hello world 
[email protected]:~$ showargs "hello world" "bye world" 
COUNT: 2 
ARG: hello world 
ARG: bye world 
[email protected]:~$ str="hello world" 
[email protected]:~$ showargs $str 
COUNT: 2 
ARG: hello 
ARG: world 
[email protected]:~$ showargs "$str" 
COUNT: 1 
ARG: hello world 
+0

Tôi không thấy bất kỳ tham chiếu nào đến q là thông số định dạng hợp lệ trong trang hướng dẫn. Ai đó có thể giải thích lý do tại sao% q hoạt động? Nó có bị phản đối và bây giờ có tham số định dạng ưa thích mới không? Tôi không thấy bất kỳ điều gì trong trang hướng dẫn mô tả chức năng này. –

+0

Từ đầu ra của 'help printf' -'% q \t trích dẫn đối số theo cách có thể được sử dụng lại làm đầu vào của trình bao'. –

+1

@AnthonyDiSanti, đây là từ Bash, vì vậy bạn có thể tìm thấy nó trong 'man bash' hoặc' help printf' trong trình bao Bash. Có lẽ bạn đang nhìn vào 'người đàn ông 1 printf' hoặc' người đàn ông 3 printf'? '% q' không áp dụng cho chúng. –

1

Hãy thử

printf %q "${str}" 

trong kịch bản của bạn.

0

Điều này phù hợp với tôi.Đáp ứng các yêu cầu này

  1. Chấp nhận đầu vào tùy ý có thể bao gồm vỏ ký tự đặc biệt
  2. Liệu không ký tự thoát ra, các "\"
#! /bin/bash 

FOO='myTest3$; t%^&;frog now! and *()"' 

FOO=`printf "%q" "$FOO"`      # Has \ chars 
echo $FOO 

# Eat all the \ chars 
FOO=$(printf "%q" "$FOO" | sed "s/\\\\//g")  # Strip \ chars 

echo $FOO 
+0

Vì vậy, nếu tôi lặp lại $ FOO trước lệnh thoát, đầu ra chính xác giống như tiếng vọng cuối cùng của bạn. Vì vậy, nó xuất hiện mà bạn đang unescaping chuỗi thoát của bạn, trong trường hợp nào là điểm của nó thoát? (ít nhất là trong ngữ cảnh được hiển thị ở đây) –

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