1 间隔符
在shell下的for循环语句中,容器中,各个元素之间 是通过 间隔符 来分开的
默认情况下:读取 列表中的值----以 空格、TAB、换行 为间隔符
列表可以为:
常量
变量
某个命令的输出结果
某个目录下的所有文件
临时更改 间隔符:
IFS.OLD=$IFS
IFS=$'\n'
IFS=$IFS.OLD //换回 默认值了
注意:---设置新的 间隔符的方法
IFS=:
IFS=$'\n':;" -----表示间隔符为 换回 冒号 分号 双引号
题目:
1 先将passwd文件中包含root的每一行打印出来
2 再将该行中的每一个字段打印出来
脚本代码:
#!/bin/bash
IFS_OLD=$IFS ----给间隔符 做备份
IFS=$'\n': ----让间隔符为 换行 和 冒号
for temp in `cat /etc/passwd | grep root`
do
echo word:$temp
done
IFS=$IFS_OLD ----恢复默认的 间隔符
exit 0
2 Linux下C语言编程
1 编译步骤
编写源程序hello.c
编译:gcc -g -o hello.out hello.c
-g 说明带调试信息,以后可以使用gdb进行调试
-o 后面跟的是编译出来的可执行文件名
最后跟的是需要编译的源程序名称,可以有多个
2 gdb的使用
gdb hello.out
b 1 //设置断点 可以是 行号 函数名
run //从头开始 调试运行 //还有版本 可以使用 start 不设断点,也会停在第1条 语句上(一般为赋值语句)
list 1 //显示10行 ---问题:如果是多文件呢
next //下一步 注意:回车----自动执行上1条命令
step //进入 函数
finish //跳出本函数,即 从当前函数 返回
bt //backtrace 函数调用栈 即: 回去的踪迹
i locals //信息 局部变量 即:查看 局部变量
print result //打印 变量
set var sum=0 //设置变量的值
或p result=33 //同上
或p printf("result = %d\n",result)
frame 2 //查看其它函数下的局部变量时,先要切换 栈帧frame
或f 2
display sum //每次停下来,都显示sum的值
undisplay 取消显示
continu 或 c //运行到 下1个断点 一般,设置个新 断点,然后continue
i breakpoints //查看所有断点信息
delete breakpoints 2 //删除断点2
delete breakpoints //删除所有断点
break 9 if sum!=0 //break ... if
disable breakpoints 2
enable breakpoints 2
x/7b array1 //打印存储器内容 7组 每组为1个字节 地址,如数组名
watch array1[5]
info watchpoints //查看所有的 观察点
quit //退出 gdb
3 makefile的使用
编辑makefile
all:
gcc -g -o aaa.out hello.c
clean:
rm *.out
注意:
1) all行不能少
2) 第2行是命令,前面必须用TAB键进行分隔,不能用空格
3) 使用时,直接运行make就会自动调用该makefile文件的规则进行编译
5 宏定义
#define PI 3.1415
#define MAX_ARRAY 100
int a[MAX_ARRAY];
#define MAX_ETC(a,b) ((a)>(b)?(a):(b))
int main()
{
((10)>(20)?(10):(20));
return 0;
}
6 编译预处理
场合:在h文件中经常要用
如在student.h中
#ifndef STUDENT_H
#define STUDENT_H
int sum(int a,int b,int c);
int get_math();
#endif
用法:
1)如果student.c文件中,加入了一行代码 #include "student.h"
2)如果people.c文件中,加入了一行代码 #include "people.h". 如果people.h文件中已有很多.h文件
7 提高调试效率的2大手段
手段1:----使用 assert 宏定义
注意:
1)只在debug下有效
2)当assert后面的条件不成立时,程序会终止,并打印出错的信息。
如:
assert(age<100); //当年龄age 大于等于100时,该语句会异常终止,并有详细的错误信息(注意,在Release版本中,该语句会失效,因此是用于调试的手段)
手段2:----使用 __func__,__FILE__,__LINE__
(注意是 双下划线)
__func__ 为当前语句执行时的 函数名(字符串) ----C99中增加的内容,是1个特殊的标识符,直接用就可以了。注意:它不是 宏定义
__FILE__ 为当前语句执行时的 文件名(字符串) ----是 宏定义
__LINE__ 为当前语句执行时的 行号(整型数) ----是 宏定义
所以可以使用如下语句:
printf("%s %s %d\n",__func__,__FILE__,__LINE__);