我应该在什么情况下使用音译中的美元符号和单引号(例如.tr -d'\n')或任何其他函数?

Tom*_*Tom 2 bash tr

说我试图删除换行符或carrige返回.我注意到,当我使用音译来删除换行符时tr -d '\n',我得到的结果与我tr -d $"\n"或是相同tr -d $'\n'.有什么不同?

我不确定在sed或grep中是如何应用的,因为它们更复杂.所以,我试图先找出tr,因为这似乎是一个更简单的bash程序.

Tob*_*ght 5

tr 自己逃避:

  • 当你写作时tr -d '\n',tr程序本身会识别\+ n并替换换行符.
  • 当你写作时tr -d $'\n',Bash会转换\n为换行符,并且tr会逐字逐句地看到它.

如果您正在尝试了解shell的作用,那么编写一个简短的C程序来逐字打印每个参数可能是值得的 - 例如:

#include <stdio.h>

int main(int argc, char **argv)
{
    int i;

    /* Ignore argv[0] - the program name is not interesting */
    for (i = 1;  i < argc;  ++i) {
        char *p = argv[i];
        printf("argv[%d] =", i);
        while (*p)
            printf(" %3d", (int)*p++);
        printf("\n");
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这个以十进制打印,但很容易将其更改为使用十六进制或八进制.使用$'\n' \n "\n"as参数运行它给出:

argv[1] =  10
argv[2] = 110
argv[3] =  92 110
Run Code Online (Sandbox Code Playgroud)

显示在第一种情况下,Bash传递一个换行符,在第二种情况下,只传递'n',在最后一种情况下,传递'\'和'n'.