嵌入式——Linux软件编程2

嵌入式——Linux软件编程2
【Linux软件编程学习笔记】Shell循环、数组、函数 C语言标准IO文件操作今日学习内容shell while、for循环shell数组shell函数 C语言IO文件操作。文章大纲shell while循环shell for循环shell数组shell函数C语言标准IO操作4.2 IO✨学习重点⚠️易错点汇总今日学习小结1. while循环while属于条件循环条件为真就循环执行条件为假退出循环。语法格式while 条件 do # 循环体代码 done示例1计数循环i1 while [ $i -le 5 ] do echo i $i i$((i1)) done示例2死循环while true do echo 死循环 done退出循环快捷键Ctrl C拓展until循环条件为假执行条件为真退出日常开发用的比较少。2. for循环shell有两种for写法遍历集合版、C语言风格for循环。写法1遍历列表最常用for var in 1 2 3 4 5 do echo $var done配合通配符遍历目录文件#遍历当前目录所有sh文件 for file in *.sh do echo $file done写法2C语言风格for循环for ((i0; i5; i)) do echo $i done循环控制语句break跳出整个循环直接结束循环continue跳过本次循环剩余代码直接进入下一轮循环3. Shell数组shell数组下标从0开始shell数组不限制元素类型内部全部存储字符串。3.1 数组定义#方式1整体赋值 arr(apple banana orange) #方式2单独给下标赋值 arr[3]pear3.2 数组读取echo ${arr[0]} #读取下标0元素 echo ${arr[]} #读取数组全部元素 echo ${arr[*]} #读取数组全部元素 echo ${#arr[]} #获取数组元素总个数${arr[]}和${arr[*]}区别把每一个元素作为独立个体*所有元素合并成一整个字符串。3.3 数组遍历arr(10 20 30 40) for v in ${arr[]} do echo $v done3.4 修改、删除数组元素arr[1]200 #修改指定下标元素 unset arr[2] #删除下标为2的元素**下标不会自动补齐** unset arr #删除整个数组注意unset arr[2]删除后数组下标会保留空缺不会自动重排4. Shell函数把重复代码封装成函数实现代码复用提高脚本可读性。4.1 函数定义语法方式一func_name() { #函数体 }方式二function func_name { #函数体 }4.2 函数调用直接写函数名调用不需要括号func_name4.3 函数传参shell函数没有形参列表依靠位置变量$1 $2 $3 $# $ $* $?获取传入参数。test_func() { echo 第一个参数:$1 echo 第二个参数:$2 echo 参数总个数:$# } test_func aa bb cc4.4 函数返回值shell函数的return只能返回0‑255之间数字用来表示执行状态0成功非0失败如果想要返回字符串/大数不能用return可以在函数内部echo输出调用时用变量捕获输出结果。示例捕获函数输出add() { echo $(( $1 $2 )) } res$(add 10 20) echo 结果$res注意return不能返回字符串超出255数字会发生取模截断。4.5 变量作用域脚本直接定义变量全局变量函数内外都可以访问。函数内部使用local修饰局部变量仅函数内部有效函数执行结束销毁。demo() { local num100 echo $num }5. C语言标准IO操作 IOLinux下一切皆文件。C语言标准IO库stdio.h是对系统调用open/read/write的封装带用户缓冲区文件操作围绕FILE*文件指针完成。5.1 三个标准流程序启动自动打开文件指针描述文件描述符stdin标准输入键盘0stdout标准输出终端屏幕1stderr标准错误输出终端屏幕25.2 文件打开与关闭 fopen / fclose#include stdio.h FILE *fp; //打开文件 fp fopen(test.txt,r); //必须判断打开是否成功打开失败返回NULL if(NULL fp) { perror(fopen); //打印出错原因 return -1; } //关闭文件用完一定要关闭刷新缓冲区释放资源 fclose(fp); fp NULL; //置空防止野指针打开模式模式含义r只读文件必须存在否则打开失败w只写文件不存在创建存在则清空原有内容a追加写文件不存在创建在文件末尾追加r可读可写文件必须存在w可读可写不存在创建存在清空a可读追加写b模式rb/wb二进制读写Linux下文本文件和二进制文件无区别Windows需要区分。5.3 单字符读写 fgetc / fputcint ch; ch fgetc(fp); //从文件读取一个字符读到末尾返回EOF(-1) fputc(A, fp); //向文件写入一个字符5.4 按行读写 fgets / fputschar buf[32]{0}; fgets(buf, sizeof(buf), fp); //读取一行最多读size‑1个字节会读取换行\n fputs(buf, fp); //把字符串写入文件**不会自动加换行**5.5 格式化读写 fprintf / fscanf//向文件格式化输出 fprintf(fp,num %d\n,100); //从文件格式化读取 int a; fscanf(fp,%d,a);5.6 二进制读写 fread / fwrite用于读写结构体、二进制数据size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);ptr数据缓冲区size单个元素字节大小nmemb读写多少个元素返回值成功读写的元素个数不是字节数5.7 文件位置指针文件偏移fseek(fp, offset, whence); //移动文件位置指针 // whence: SEEK_SET 文件开头SEEK_CUR 当前位置SEEK_END 文件末尾 ftell(fp); //获取当前距离文件开头的字节偏移量 rewind(fp); //将文件指针重置到文件开头5.8 缓冲区标准IO自带用户态缓冲区行缓冲stdout遇到\n才刷新缓冲区全缓冲普通磁盘文件缓冲区满才刷新无缓冲stderr直接输出。手动刷新缓冲区fflush(fp);5.9 判断文件结束feof(fp)判断上一次读取是否到达文件末尾不能作为循环条件直接放最前面✨学习重点Shell部分while循环条件判断格式死循环写法break continue控制循环。for循环两种写法遍历集合for、C语言风格for((;;))掌握通配符遍历文件。shell数组${arr[]}获取全部元素${#arr[]}得到数组长度与*的区别unset删除数组元素的行为特点。shell函数函数定义、调用不带括号函数传参依靠位置变量$1 $2 $#没有形参列表return只能返回0‑255状态码获取字符串返回值要用$(函数)捕获echo输出local定义函数局部变量。C语言标准IO部分FILE*文件指针fopen打开一定要判断返回值是否为NULL用完fclose关闭文件。分清6种打开模式r w a r w a重点区分w清空、a追加。文本读写fgetc/fputc字符fgets/fputs行fprintf/fscanf格式化。二进制读写fread/fwrite返回值是成功读写的元素个数不是字节数。文件指针移动fseek、ftell、rewind三个函数。标准IO缓冲区概念行缓冲、全缓冲fflush手动刷新缓冲区。stdin stdout stderr三个标准流。⚠️易错点汇总Shell易错while条件的[]括号内侧必须留空格while [ $i -le 5 ]少空格直接语法报错。shell算术运算不能直接写ii1必须写成i$((i1))。数组unset arr[2]只是清空该下标内容不会重新排列下标遍历会跳过该下标。shell函数调用不能加括号test_func()是定义调用写test_func。函数return只支持0‑255数字不能返回字符串不能返回大于255数字大数/字符串用echo$()捕获。函数内不写local定义的变量全部是全局变量容易出现变量污染。C语言标准IO易错fopen打开文件之后不判断NULL直接操作fp发生段错误。打开模式混淆w会直接清空原有文件内容a只能在末尾追加不能修改中间数据。fgets会读取换行符\n读到的字符串末尾可能自带换行需要手动处理。fread/fwrite返回值是元素个数不是字节数判断返回值不要和字节数对比。feof()不能放在循环最开头只有读操作之后才能用feof判断是否到文件末尾。文件打开之后忘记fclose缓冲区数据丢失资源泄露。fseek打开a追加模式时部分系统下写操作会强制回到文件末尾seek修改位置不生效。缓冲区未刷新程序崩溃时缓冲区中还没写入磁盘的数据直接丢失可以使用fflush强制刷盘。今日学习小结今天分为两大模块shell脚本掌握while、for循环shell数组增删遍历shell函数定义调用、传参、返回值、局部变量。shell语法对空格符号非常敏感写脚本要注意语法坑。C语言标准文件IO基于FILE*完成文件打开关闭、字符/行/格式化/二进制读写掌握文件指针偏移理解用户缓冲区机制。注意区分shell是脚本语言C语言IO是库函数封装了系统调用自带缓冲区操作磁盘文件必须做好判空、关闭防止内存、资源泄露。

最新新闻

日新闻

周新闻

月新闻