前言
简单总结了Shell脚本设计,C in Linux 的编程和编译,以及GTK+的简单原理
Shell程序设计
bash程序执行步骤
- 编辑保存
vi
- 赋可执行权限
chmod
./filename.sh
执行
bash程序结构
# file.sh
1 | #!/bin/bash ****Shell类型**** |
变量
定义变量
1 | 变量=值 # "="两边不能留空格 |
变量都会被默认成字符串
引用变量
用户自定义变量要加$
,加{}
可以同其他字符分开(建议添加)
1 | ${xxx} |
双引号
会替换$
变量成值。参数中包含空格也要用双引号。
单引号
字符串值,不会替换$
变量
倒引号 ``
替换命令为其执行结果
特定变量
1 | $@ # 参数列表(数组) |
算术运算
expr 命令
计算算术表达式,支持 +
、-
、\*
、/
、%
(要``\``进行转移,否则会错误)
支持|
,&
,>
,>=
,!=
,=
等逻辑运算,|
,>
,<
要用\
转义才能使用
语法:
1 | expr arg |
数字符 和 符号 间要空格
要改变运算次序的话需要使用``倒引号
1 |
|
$((…))运算
直接运算得出结果
示例:
1 | echo $((5+7)) |
条件判断
0真,1假(与熟知C语言判断相反)
语法:注意!中括号两边要空格!!!
1 | [ 条件判断语句 ] |
多重条件判断组合
1 | -a # 与 |
算术比较:
1 | a -eq b # 相等(equal) |
字符比较:
1 | s1 = s2 # 字符串相同 |
文件判断
1 | -d file # 是目录 |
if 分支语句
结构:
1 | if [ 条件1 ] |
case 模式匹配 分支语句
结构:
1 | case 条件1 in |
模式匹配配对符:
1 | ? # 任意一个字符 |
for 循环
结构:
1 | for 变量 [in 列表] |
可用 in 1,2,3,4...
或者默认使用in $@
。其中$@
是参数数组
while 循环
结构:
1 | while/until [ 条件 ] |
函数
结构:
1 | [function] 函数名(){ |
- 如果最后不使用return返回,函数返回的就是最后一条命令的返回值
C in Linux
gcc编译过程
gcc命令
语法:
1 | gcc [选项] [filename] |
选项:
1 | -c # 编译.c文件生成.o文件,不生成可执行文件 |
总结:在编译过程中。除非使用了”-c”,“-S”,或”-E”选项(或者编译错误阻止了完整的过程),否则统一完整链接步骤。
编译
分步编译
先用-c
,-S
,-E
中断编译过程,生成中间文件,再用gcc 中间文件
完成编译
示例:
1 | gcc -c hello.c -o hello.o |
一步编译
1 | gcc hello.c say_hello.c -o hello |
使用-Idirname
增加搜索头文件目录
示例:
当前目录为./hello.c ./functions/say_hello.h ./functions/say_hello.c
1 | gcc hello.c functions/say_hello.c -o hello -Ifunctions |
make 软件维护工具
makefile文件
格式:
1 | 目标文件: 依赖项列表 |
依赖项可以不写.h文件,但一定要写清.c文件的路径
示例:
当前目录为./hello.c ./functions/say_hello.h ./functions/say_hello.c
1 | hello:hello.o say_hello.o |
makefile可以使用变量宏命令${}
1 | CC=-Wall-c |
使用makefile
在存放makefile文件的目录下使用:make
调试工具 gdb
- 设置断点
- 监视变量
- 单步执行
- 修改变量值
进入gdb:gdb
使用gdb
1 | file # 装入可执行文件 |
1 | # 执行程序 |
函数库
静态函数库
库文件名:libxxxxx.a
静态函数库文件比较大,因为整个函数库的所有代码都会被整合编译到目标代码中,所以使用静态库编译后的程序不需要外部函数库支持,因为都已经编译进去了。但是如果今天函数库改变了就需要重新编译。
创建
编译生成.o文件:gcc -c pr1.c pr2.c
链接静态库:ar -rsv libpr.a pr1.o pr2.o
使用
加载库文件编译:gcc -o main main.c -L./ -lpr
动态函数库
库文件名:libxxxx.so
动态函数库在编译时没有被编译进目标代码中,当程序执行到时才会调用函数里的相应函数。所以使用动态函数库产生的可执行文件较小。
创建
生成动态库:gcc -fpic -shared -o libpr.so pr1.c pr2.c
使用
调用动态库:gcc -o main_so main.c ./libpr.so
GTK+
GTK+控件
GtkWidget:GTK控件的父类,所有控件按照此类型返回
创建控件:GtkWidget * gtk_xxxx_new(GtkNodeType type 或者 void)
设置xxx:void gtk_xxx_set_xxx(GtkNode *xxx, XX message)
读取xxx:xx gtk_xxx_get_xxx(GtkNode *xxx)
存放进窗体:gtk_container_add(GTK_CONTAINER(windowxx), xxxx)
显示窗体:gtk_widget_show_all(window)
界面布局采用横向hbox
和纵向vbox
示例:
1 |
|
回调函数、信号
GTK+用信号(signal)和回调函数(callback)处理外部事件。
信号与回调函数绑定
采用g_signal_connect
函数来完成信号和回调函数绑定。
1 | g_signal_connect(gpointer *object, // 连接信号的对象 |
回调函数
回调函数的函数原型(用户自己定义):
1 | void callback_func(GtkWidget *widget, // 发出信号的控件的指针 |