在什么情况下我应该在音译(例如 tr -d '\n')或任何其他函数中使用美元符号和单引号?
What cases should I use dollar sign and single quotes in transliterate (eg. tr -d '\n'), or any other function?
假设我正在尝试删除换行符或回车符 returns。我注意到,当我使用音译删除换行符 tr -d '\n'
时,得到的结果与 tr -d $"\n"
或 tr -d $'\n'
相同。有什么区别?
我不确定这在 sed 或 grep 中如何应用,因为它们更复杂。所以,我试图首先找出 tr,因为它似乎是一个更简单的 bash 程序。
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;
}
这个以十进制打印,但很容易将其更改为使用十六进制或八进制。 运行 它以 $'\n'
\n
"\n"
作为参数给出:
argv[1] = 10
argv[2] = 110
argv[3] = 92 110
显示在第一种情况下,Bash 传递单个换行符,在第二种情况下,仅传递 'n',在最后一种情况下,'\' 和 [=36] =].
假设我正在尝试删除换行符或回车符 returns。我注意到,当我使用音译删除换行符 tr -d '\n'
时,得到的结果与 tr -d $"\n"
或 tr -d $'\n'
相同。有什么区别?
我不确定这在 sed 或 grep 中如何应用,因为它们更复杂。所以,我试图首先找出 tr,因为它似乎是一个更简单的 bash 程序。
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;
}
这个以十进制打印,但很容易将其更改为使用十六进制或八进制。 运行 它以 $'\n'
\n
"\n"
作为参数给出:
argv[1] = 10
argv[2] = 110
argv[3] = 92 110
显示在第一种情况下,Bash 传递单个换行符,在第二种情况下,仅传递 'n',在最后一种情况下,'\' 和 [=36] =].