2010-09-08 17 views
6

Tôi nên sử dụng chức năng nào để thoát chuỗi cho đối số lệnh trình bao trong C?C chức năng để thoát chuỗi cho đối số lệnh shell?

  1. Tôi có một chuỗi:

    This is a string with() characters

  2. Đây sẽ là lỗi:

    echo This is a string with() characters

  3. Đây là OK:

    echo "This is a string with() characters"

    echo This is a string with \(\) characters

Có chức năng chuyển đổi được xác định trướC# 2 # 3 trong C?

Trả lời

6

Thay thế tất cả các phiên bản ' bằng '\'' sau đó kèm theo toàn bộ chuỗi trong dấu nháy đơn (') là một cách an toàn. Điều này làm việc ngay cả với các dòng mới được nhúng. Một phương pháp khác là chèn \ trước mỗi ký tự, ngoại trừ sau đó bạn phải thực hiện một số xử lý đặc biệt cho dòng mới từ \ theo sau là một dòng mới bị bỏ qua bởi vỏ, không được coi là dòng mới. Bạn sẽ phải bao quanh các dòng mới với ' (dấu nháy đơn).

+1

hãy thử điều này bằng chuỗi: a'b. đối với tôi, echo 'a \' b '.... không hoạt động trong bash, nhưng echo' a '"'" 'b' hiện .... –

+1

@ErikAronesty: Tôi đã nói thay thế ''' bằng ' '\' '', không phải với' \' '. –

+0

Lưu ý rằng trích dẫn các kết quả ''' trong '' '\' ''', mà thực ra là một chuỗi gồm ba chuỗi được nối thêm vào đánh giá. Do đó, đây không phải là báo giá thực. – ManuelSchneid3r

1

Không có gì được xác định trước và các ký tự nào cần thoát tùy thuộc vào trình bao của bạn. Xem tài liệu cho trình bao của bạn và thay thế mỗi X bằng \ X. Sử dụng dấu ngoặc kép "sẽ yêu cầu xử lý tương tự nếu chuỗi bạn đang kèm theo chứa".

Cũng lưu ý rằng điều này sẽ trở nên phức tạp hơn nếu bạn có ý định để đóng gói biểu thức phức tạp hơn (bất cứ điều gì phức tạp với một ';', ví dụ)

0

phiên bản thứ hai của bạn là 3. rất dễ dàng, không có?

printf("\"%s\"", your string); 
+3

này phá vỡ trong trường hợp chuỗi chứa dấu ngoặc kép ('" '). –

2

Không có hàm được xác định trước.

Tuy nhiên, tôi tin rằng đủ để chỉ bao gồm bất kỳ đối số trình bao nào trong các dấu nháy đơn và đảm bảo rằng các dấu nháy đơn được thoát.

Đó là logic của hàm escapeshellarg trong PHP và tôi tin rằng nó hoạt động khá tốt.

+0

Trong bối cảnh của vỏ lưu ý rằng có một differece giữa qouting với đơn hay ngoặc kép. Với dấu ngoặc kép [bạn phải thoát ra $ và 'cũng vậy (https://www.gnu.org/software/bash/manual/html_node/Double-Quotes.html#Double-Quotes). – ManuelSchneid3r

+0

Xin lưu ý rằng vỏ không cho phép dấu nháy đơn trong các chuỗi được trích dẫn đơn lẻ. – ManuelSchneid3r

1

C không phải là ngôn ngữ của tôi lựa chọn, nhưng đây là những gì tôi đã đưa ra (phải trả lời cùng một câu hỏi, bản thân mình).

#include <stdio.h>  // sprintf 
#include <stdlib.h> // malloc 
#include <string.h> // strlen 

char* escapeshellarg(char* str) { 
    char *escStr; 
    int i, 
     count = strlen(str), 
      ptr_size = count+3; 

    escStr = (char *) calloc(ptr_size, sizeof(char)); 
    if (escStr == NULL) { 
     return NULL; 
    } 
    sprintf(escStr, "'"); 

    for(i=0; i<count; i++) { 
     if (str[i] == '\'') { 
        ptr_size += 3; 
      escStr = (char *) realloc(escStr,ptr_size * sizeof(char))); 
      if (escStr == NULL) { 
       return NULL; 
      } 
      sprintf(escStr, "%s'\\''", escStr); 
     } else { 
      sprintf(escStr, "%s%c", escStr, str[i]); 
     } 
    } 

    sprintf(escStr, "%s%c", escStr, '\''); 
    return escStr; 
} 

Với escape'this', nó sẽ ra 'escape'\''this'\''', có thể sau đó được chuyển tới echo.

$ echo 'escape'\''this'\''' 
escape'this' 
+0

không phải là hoạt động vượt trội của realloc? Tôi nhớ rằng có thể toàn bộ chuỗi được sao chép sang một địa điểm mới. Nó sẽ là tốt hơn để phân bổ 2 * str_size lúc đầu. Bạn không thường xuyên sử dụng các đối số với rất nhiều ''' nhưng vẫn ... – NickSoft

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