shell学习日记

系统学习日记
系统:
shell语言: 解释性脚本语言 不需要编译就可以运行
1 相关概念:
操作系统:window 安卓 ios鸿蒙 linux
作用:管理文件系统/内存分配/网络/设备管理
内核的五大功能:
1 文件管理
2 网络管理
3 内存管理
4 设备管理
5 进程管理
函数:
函数功能
函数参数
函数的返回值
ubuntu安装
1 安装真机 (开机直接运行的linux操作系统)
2 安装双系统 (linux window)
3 安装虚拟机
第二天************
目录类型:树状
根目录: “/”
打开终端:ctrl+alt+t // 鼠标右键单击 在终端打开
在一个终端打开另一个终端:ctrl+shift+t //关闭 ctrl+shift+q
在一个目录里有一个或两个点//1个点代表当前目录 2点代表上一级目录 cd . //cd… // cd …/… /分割
终端界面放大缩小 ctrl+shift+ + ctrl–
想要操作硬件,就要想办法把硬件注册为一个设备节点。
相对路径:相对于当前路径来说
绝对路径:相对于根目录 以/为起点
目录结构
boot 启动文件
dev 设备文件 //里边放的全部是和设备有关的节点文件
etc 系统程序和大部分应用程序的全局配置文件
lib 系统程序库文件

指令就是人机交互的指令
学习指令的帮助手册
man+指令 man+函数名
命令的格式说明
命令+选项+文件 命令不可省略 选项可以省略 文件可以省略 如ls -a hello.c
-普通文件
d目录
b块设备
c字符设备
s套接字
p管道
r 可读 4
w 可写 2
x 可执行 1
chmod 777 xxx //chmod可以修改权限 //777读写执行权限 //xxx文件
通配符:

  • 所有文件
    ? 表示在该位置可以是任意一个字符
    命令补全 tab
    基本命令:
    ls 查看当前目录下所有文件 -l显示文件的详细信息 -a显示所有文件(包括隐藏文件)
    cd 切换路径 cd ~切换到普通用户的家目录 cd …切换到上一级目录 cd -切换到上一次所在的目录
    cd /根目录 cd路径可以是绝对路径或相对路径 cd !$ 上一次的参数作为本次的参数使用
    mkdir 创建一个文件夹 mkdir -p 多级嵌套 mkdir a/d/c -p
    -m 创建文件的同时为文件指定权限 mkdir -m 644 xyd
    创建文件:touch gedic vim
    rm 删除指定的文件或目录
    目录删除时要加-r rm -r xxx(目录)
    -rf 强制删除
    cp 复制 拷贝文件 cp 文件名(路径 相对或绝对) 复制的位置
    mv 移动文件的位置
    修改文件的名字
    ./ 执行
    打包压缩
    tar -cvf xx.tar xx 压缩
    tar -xvf xx.tar 解压
    tar -xvf xx.tar -C 将文件解压到指定的路径
    历史命令:history
    系统管理命令:
    ps查看当前系统由该用户运行的进程列表
    -ef 查看进程以及进程号,系统时间 命令等
    网络命令:
    ifconfig //查看网络配置
    ifconfig ens33 ip //配置ip ifconfig eas33 192.168.13.3(自己指定的 上不了网)
    ifconfig eas33 down //配置ip
    ifconfig eas33 up //配置ip
    cat 不用打开该文件就可以查看内容
    find 搜索文件 你想搜索一个文件但是不知到在具体路径下边,但是知道文件的名字,可以使用fid
    echo可以实现回显和 echo “hello”>>1.txt 把hello写在1.txt里
    sudo apt-get install xxx 安装xxx
    sudo apt-get remove xxx 卸载xxx
    sudo apt-get upgrade xxx 进行系统升级xxx
    sudo apt-get update xxx 更新软件信息数据库
    创建链接文件: ln -s
    测试网络: ping +网站名

vim使用:
1 进入到编辑模式,按键i,此时可以移动光标到想修改的位置,同时我们修改内容如下:(注意界面左下角进入到了insert的模式,才代表现在是编辑模式)
2 推出编辑模式,并保存,按键esc退出insert模式,然后按shift+: (shift+冒号键),然后输入wq,wq表示,保存并退出。如果只按键q,则是只退出不保存。
3 最后,按 enter键退出界面,再次查看内容,验证一下,如下图所示。

int main(int argc,char *argv[])
argc:参数的个数
argv:具体的参数
argv[0]==命令本身

第三天*********************************************888
常用工具:
1 编辑工具vim
2编译工具gcc
3调试工具gdb
4
5
***编辑器
gedit vim touch
vim是vi的升级版
vim系统不自带 sudo apt-get install vim (虚拟机要联网)下载
无法获得锁:sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock
vim的使用:
vim+文件名 打开或创建一个文件
vim+文件名+行号 打开一个存在的文件并跳转到指定行
命令行模式:
打开一个文件后默认为命令行模式,按i进入插入模式,按esc推出插入模式。
(n) dd 删除光标所在一行
文本复制操作
(n) yy 复制光标所在的一行
粘贴 p
文本还原
u 撤销指令
ctrl+u将屏幕向前翻半屏幕
ctrl+d 将屏幕向后滚动半屏目
ctrl+f 将屏幕向后滚动一屏幕
ctrl+b 将屏幕向前滚动一屏幕

指针跳变 gg跳开头 G跳末尾
快速对齐粘贴的代码 gg=G
插入模式:
插入文本命令:i将文本插入到光标所在位置
底行模式:
命令行模式下shift+;(冒号)
退出 wq 保存并推出
w 保存不退出
q 退出不保存
q!强制退出不保存
w! 强制保存不退出
搜索字符串 ?+字符串 搜索到的字符串会显示高亮,去除高亮:noh ///要想让搜到的字符串高亮,要先配置etc/vim/vimrc 注意在管理员的权限下。
字符串替换 : %s/源字符串/目标字符串/g
可视模式
在命令行模式按v
d 删除 y复制 x剪切
gcc编译过程
编译预处理 gcc -E xxx.c -o xxx.i 头文件 宏定义 条件编译指令
编译 gcc -S xxx.i -o xxx.s 把预处理完的文件进行一系列语法/词法/语义分析及优化后生成相应的汇编代码文件。
汇编 as xxx.s -o xxx.o 汇编器将汇编代码转换为机器可以执行的指令,每一条汇编语句对应一条机器指令
连接 gcc xxx.o -o xxx 头文件只是函数声明,实现封装在库文件中,连接就是找到指定路径下的库文件
gcc -g xx.c 产生的可调式的代码gdb
gcc xx.c 这两个生成的文件大小不一样 gcc -g较大 生成的代码添加了调试信息
动态库和静态库: 移植性 封装性 保护源码
区分动态库和静态库的方法;
静态库以.a结尾 编译的时候已经编译到./a.out了
动态库以.so结尾 编译的时候去查找这个库
库的制作:
静态库的制作.a: gcc xx.c -c 生成.o文件
ar -rc libxx.a xx.o 打包生成静态库
gcc main.c libfun.a 利用静态库编译程序
动态库的创建.so
gcc xx.c -c 或 gcc xx.c -c -fpic 生成.o文件
gcc -fpic -shared xx.o -o libfun.so 生成动态库
把库文件复制到/lib或/usr/lib cp命令
gcc main.c -lxx // 利用动态库编译,后面跟需要连接的库
./a.out 执行程序,运行期间会寻找动态库,只会在系统默认路径下寻找,所以需要把库文件复制到/lib 或/usr/lib
区别:
静态库直接将库文件编译到可执行程序里
动态库动态的去lib usr/lib下去寻找需要的库文件加载
ldd a.out 查询a.out 程序运行需要的库文件
调试工具jdb:

gdb + 编译生成的文件
gdb +a.out
常用调试的指令:
run r 运行一个程序
l l相当于list,从第一行开始列出源码
断点:程序运行到断点处就停止运行
break 许多命令可以设置断点,helpbreakpoint会列出这些命令
b 16 在代码的16行设置断点
info break 查看断电信息
b 函数名
继续运行 cont 直到下一个断点
delete d breakpoint num 删除断点
clear clear line—num 清除行号
print p arg 查看变量的值 arg变量
next n 单条语句执行
step

makefile工程管理
可以管理大小工程
make 相当于脚本编译语言 本质是实现自动化编译 依赖:需要makefile文件支持
make里的注释#开头
all: main.o led.o
输入make 读取makefile文件编译整个工程
make clean 工程清理工作

编写规则:使用vim编译建立makefile 目标+依赖 tab+语法
变量的定义:nakefile里面的变量没有类型之分,直接定义即可
引用使用:$符号
预定义变量 宏 $^ :所有的依赖文件
$@ :目标文件
KaTeX parse error: Expected 'EOF', got '#' at position 198: …设置 代码的第一行一定要是 #̲!/bin/bash 声明s…符号
cc=gcc $(cc)=gcc
直接定义:str=hello //等号的两端不能加空格
双引号定义 str=“hello” 保留特殊符号的引用含义
单引号定义 str=‘hello’ 去除特殊符号的引用含义 $
小飘号定义:str=$(date) 类似于命令的重定向,命令运行结果重定向到变量里
命令重定向:>输出重定向(覆盖原内容)
>>输出重定向(不覆盖原内容,追加)
变量的分类:
特殊变量: $0 命令本身
$1 2 3 //取命令行参数
$@ //取所有的参数 不包括第0个
$? //判断上一条命令是否执行成功,成功0失败非0
$# //传递参数的个数
$$ //显示当前的进程号
环境变量:由系统维护,用于设置系统的shell工作环境,极少数用户可以修改
执行命令的时候,就回去指定的目录(bin sbin usr/bin)去寻找是否有这个命令
运行程序的时候去指定的目录(lib usr/lib)去找库文件
env显示所有的环境变量
export PATH= P A T H : / r o o t / / 将 r o o t 路 径 添 加 到 P A T H 环 境 变 量 里 边 将 这 句 话 加 入 到 开 机 自 启 动 的 文 件 里 面 即 可 永 久 生 效 / e t c / p r o f i l e ( 推 荐 ) e x p o r t L D L I B R A R Y P A T H = . / : PATH:/root //将root路径添加到PATH环境变量里边 将这句话加入到开机自启动的文件里面即可永久生效 /etc/profile(推荐) export LD_LIBRARY_PATH=./: PATH:/root//rootPATH/etc/profileexportLDLIBRARYPATH=./:LD_LIBRARY_PATH 加到profile里
(设置动态库路径,这样就不用将动态库复制到/usr/lib里了
LD_LIBRARY_PATH: 动态库的查找路径)
变量都是字符串,没有类型之分,不用声明

输入输出: read num //输入num
readonly num=5 //定义只读变量 num
输出:echo命令
printf
运算表达式:
test条件表达式 test 表达式1=表达式2 等号两边须有空格
test string1=string2
[条件表达式] [string1=string2] 条件表达式值为真返回0,为假返回非0 echo$? 0为真 非0为假
条件表达式两边要有空格
判断整数:-gt 大于 test 1 -gt 2 或 [ 1 -gt 2 ]要加空格
-ge 大于等于 -eq 等于 -le小于等于 -lt小于 -ne不等于
判断表达式 -a:and 两个条件都要满足
-o:or 至少满足一个
如 [ 1 -gt 2 -a 2 -lt 3]
字符串比较:
[[ -z str ]] //长度为0 返回0
[[ str1 == sre2 ]] //判断是否相等
[[ str1 != str2 ]]
文件条件测试:
-f 文件 //文件存在且是普通文件时,返回真
-l 文件 //存在且是连接文件时,返回真
-d 文件 //存在且是一个目录时,返回真
-e 文件 //(文件或目录存在时,返回真)
-s 文件 // 存在且大小大于0时,返回真
-r 文件 //(文件或目录)存在且可读时,返回真
-w 文件 //(文件或目录)存在且可写时,返回真
-x 文件 //(文件或目录)存在且可执行时,返回真
流程控制
if expr1
then
commands1
elif expr2
then
commands2
else
commands3
fi
case:
case $变量 in
“1”)
命令1
;;
“2”)
命令2
;;
esac
for:
for((i=0;i<5;i++))
do
语句
done
while:
while[循环条件]
do
语句
done
until:
until 条件
do
命令
done
break 用于强行退出当前循环 如果是循环嵌套,则break命令后边可以跟数字n,表示退出第n重循环
continue :用于忽略本次循环的剩余部分,回到循环的顶部,继续下一次循环
数组:
定义:a=(1 2 3 )
引用:取值 ${a[0]}
${a[@]} //取数组中所有的值
${#a[@]} //取数组的长度
${a[@]:2} //截取下标为2以后的所有元素
${a[@]:2:2} //截取下标为2以后的两个元素
函数:
调用的时候直接写函数名即可,无返回值,无参数,仅仅用来封装代码
fun()
{
}
//作业 shell脚本实现在指定目录下寻找指定类型的文件?

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值