hank$ ifs=$IFS
hank$ echo -n $IFS | od -b
hank$ echo -n "$IFS" | od -b
0000000 040 011 012
0000003
hank$ IFS=`echo -en "\n"`
hank$ echo -n "$IFS" | od -b
hank$ IFS=`echo -en "\n\b"`
hank$ echo -n "$IFS" | od -b
0000000 012 010
0000002
hank$
01)echo $IFS 和 echo "$IFS" 什么区别?
02)为何 IFS=`echo -en "\n\b"` 后,echo 出 012 和 010
但 IFS=`echo -en "\n"` 后,echo 出来却什么都没有?
03)还有就是 IFS=`echo -en "\n\b"` 感觉和 IFS=`echo -e "\n\b"` 没区别,
为何此种写法下没加 -n 选项,结果却依然是 012 010,而不是 012 010 012
为何 IFS=`echo -e "\n"` 后,echo -n “$IFS” | od -b 会什么都没有呢?底层的原因是什么?我总结了一下,它会自动抹除末尾的所有 \n,这也是为何 IFS=`echo -e "\n"` 和 IFS=`echo -ne "\n"` 等效的原因。另外就是,控制符 \b 也是朵奇葩,只有当它后面有字符存在时,才会实施真正的 “退格” 操作,这些东西当做规则记忆没问题,但就是好奇为什么会这样,不符合逻辑,码农的世界里,要么 0 要么 1,这种模棱两可,
shell对变量进行展开之后,会去掉空白符,也就是说,会造成argc的减少。
例如A/B/C三个变量都是空的,echo $A $B $C,最终echo的argc=1。
PS,对于这种问题,以下的c程序有助于帮助理解。
[~]# cat arg.c
#include <stdio.h>
int main(int ac, char *av[])
{
int i;
for (i = 0; i < ac; i++) {
char *p;
printf("av[%d]: ", i);
for (p = av[i]; *p; p++)
printf("<%c>", *p);
printf("\n");
}
}
[~]# ./arg $NOT_DEFINED_A $NOT_DEFINED_B
av[0]: <.></><a><r><g>
[~]# ./arg "$NOT_DEFINED_A" "$NOT_DEFINED_B"