2010-09-08 105 views
6

我應該使用什麼函數來在C中爲shell命令參數轉義字符串?C函數爲shell命令參數轉義字符串?

  1. 我有一個字符串:

    This is a string with() characters

  2. 這將是錯誤:

    echo This is a string with() characters

  3. 這些都是OK:

    echo "This is a string with() characters"

    echo This is a string with \(\) characters

是否有預定義的函數轉換#2#3用C?

回答

6

'\''替換'的所有實例,然後將整個字符串用單引號括起來(')是一種安全的方法。即使嵌入換行符也可以使用。另一種方法是在每個字符之前插入\,除了那麼你必須對換行符做一些特殊處理,因爲\後跟一個換行符被shell忽略,而不被視爲字面換行符。你必須用'(單引號)圍住換行符。

+1

用字符串試試這個:a'b。對於我來說,echo'a \'b'....在bash中不起作用,但是回聲'a''''''''...... – 2014-01-03 17:55:26

+1

@ErikAronesty:我說要用' '\''',而不是'\''。 – 2014-01-03 18:45:59

+0

請注意,引用'''產生''''''',這實際上是一串三個字符串,它們在評估中被附加。因此這不是真實的引用。 – ManuelSchneid3r 2017-04-02 15:35:10

1

沒有預先定義,哪些字符需要轉義取決於你的shell。查看你的shell的文檔,並用\ X替換每個X.如果您所在的字符串包含「」,則使用雙引號「將需要相同的處理」。

另外請注意,這會變得更加複雜,如果你要封裝更復雜的表達式(任何與複合「;」等)

0

你的3.第二個版本是很容易,不是嗎?

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

這打破的情況下,該字符串包含引號('「')。 – 2010-09-08 15:09:31

2

沒有預定義的功能。

不過,我相信這是足以只是附上任何shell參數在單引號,並確保單引號轉義。

這是在PHP中escapeshellarg功能的邏輯,我相信它的性能非常好。

+0

在外殼的情況下注意,單或雙引號qouting之間的型差分。用雙引號[你要逃避$和'也是如此](https://www.gnu.org/software/bash/manual/html_node/Double-Quotes.html#Double-Quotes)。 – ManuelSchneid3r 2017-04-02 15:27:38

+0

請注意,shell不允許在單引號字符串中使用單引號。 – ManuelSchneid3r 2017-04-02 15:30:44

1

C不是我選擇的語言,但這裏是我想出了(必須回答同樣的問題,我自己)。

#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; 
} 

鑑於escape'this',它將輸出'escape'\''this'\''',然後可以傳遞給echo

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

是不是重新分配運營成本?我記得有可能把整個字符串複製到一個新的地方。在開始時分配2 * str_size會更好。你不會經常使用很多'''的參數,但仍然... – NickSoft 2013-04-10 07:59:20

相關問題