Ubuntu入门与shell脚本
Ubuntu入门与shell脚本
摘要:笔记内容主要是,正点原子Linux驱动开发教程的第一部分——Ubuntu入门,自己写的笔记。
Ubuntu入门
- CPU 越强越好,内存最小16G, 硬盘最好200G以上,显卡没有要求。
- 嵌入式Linux开发需要Linux环境,如果双系统的话,一次只能运行一个系统,不好用。而Ubuntu只做为编译使用,大部分还是采用windows下进行。所以需要双系统同时运行,所以需要虚拟机。
- 虚拟机软件有VMware,virtualbox;VMware是收费的,virtualbox是免费的
- 使用15.5.0以上的版本
- 配置虚拟机
- 核心分配,一般五五分
- 内存也是五五分
- 单独分一个盘给Ubuntu,300G
- 做开发选择Ubuntu的时候,选择LTS版本,是长期支持的
- Ubuntu默认不开启数字键盘
- Ubuntu右上角可以关机
Ubuntu终端命令与shell操作
- 终端打开命令,桌面右击,打开终端,Ctrl+Alt+T
- 常见命令
- ls命令,ls命令是浏览文件,ls命令是list的缩写,就是列举,默认打开的是用户的
- ls -a,有个空格,显示目录所有文件以及文件夹包括隐藏文件
- ls -l,详细列表
- ls -al,显示所有,并详细信息
- 没必要一定要进入,给路径就行
- cd命令进入某个文件路径
- /是根目录
- cd 路径
- cd ~
- cd ../返回上一级
- cd直接输入文件夹,就是相对路径,如果加上/就是绝对路径
- pwd命令,当前文件路径,print working directory
- uname,uname -a,系统信息查看命令,unix name
- clear,清屏,假的清屏,把内容搞到上面去 ,滚动鼠标可以查看到的
- cat命令查看文件内容,concatenate的缩写锁链的意思
- sudo,superuser do,超级用户权限,采用root用户权限
- sudo su,长期切换到超级用户,不建议
- 切换回来,sudo su mss
- 删库跑路,rm /*
- touch,创建文件
- cp拷贝,cp a.c b.c 拷贝a.c重命名为b,c
- rm命令删除
- rm 文件夹名 -rf,删除文件夹
- rm *.o,删除所有的.o文件
- mkdir创建文件夹,文件夹是蓝色的字体
- rmdir删除目录
- 目录非空会报错
- mv重命名或者移动
- ifconfig命令查看ip信息
- ifconfig 网卡 down/up 关闭/打开
- 命令 —-help,帮助命令
- reboot重启
- poweroff关机
- man系统帮助命令
- sysn数据同步到磁盘
- find找文件
- find -name name
- find -iname name,忽略大小写
- Ctrl+c打断
- grep查找内容
- grep -ir
- du 文件夹 -sh,查看文件大小
- gedit 问加减你,打开文件
- ps, 当前系统进行查看
- top 查看系统进行实时状态,类似于window任务管理器,退出按Q
- file,文档类型查看
- cat 查看文件内容
- ls命令,ls命令是浏览文件,ls命令是list的缩写,就是列举,默认打开的是用户的
软件安装
- 安装方法
- 软件商店
- sudo apt-get install
- deb软件包安装
- 自己下载源码安装编译
- 下载完之后,进入
- make
- sudo make install
- 其他安装方法
- Ubuntu下面对应windows的.exe文件的是.deb
- 下载安装包,点击Linux类型的安装包
- 安装方式
- 双击安装
- sudo dpkg -i 软件名称
- dpkg是debian package
- usr -share-applications
- 或者搜索
文件
-
bin是可执行二进制文件
-
dev文件是驱动开发,cd /dev
-
etc是配置文件,密码等
-
home用户
-
media是可插拔文件
-
proc 是虚拟文件,内存的
-
usr是unix software resources
-
./是相对路径,../返回上一级,.表示当前路径
- ./表示当前文件夹
-
Linux开发选择FAT32格式的U盘
磁盘
- 磁盘文件是sd,ls sd
- 如何判定那个文件是U盘呢,重新插拔即可
- 一个是U盘,sdb
- 一个U盘的第一个分区,sdb1
- df与du查看容量
- df,整体,disk free
- du,单个,disk usage,du 磁盘名称 -h --max-depth=1
- mount和umount,挂载与卸载,路径是media的路径
- mount 设备 挂载路径
- 设备就是dev那的不能操作只能指示一下
- 当前路径是U盘中时候,不能卸载成功
- sudo mount -o iocharset=utf8 /dev/sdb1 /media/mss/msspansion
- 防止中文乱码问题
- fdisk 磁盘管理
- fdisk -l列出所有的磁盘
- fdisk操作的是dev
- sudo fdisk /dev/sdb
- 必须输入w保存命令,另外,删除的时候得卸载磁盘才可以
- 1G=1024$$1024$$1024字节,一个扇区是512个字节
- 一个G是2097152个扇区
- 做U盘系统
- sudo mkfs -t fat /dev/sdb1
压缩与解压缩
- Linux下的压缩文件格式
- .tar
- .tar.bz2
- .tar.gz
- 后两者常用
- gzip,bzip2,Ubuntu下的压缩软件与命令
- gzip只能压缩文件,不能打包
- tar打包,就是新建一个归档,重点
- -c,创建压缩文件
- -x,解压缩
- -j 使用bzip2进行压缩
- -z 使用gzip进行压缩
- -v 显示过程
- tar -vcf bzip2test.tar bzip2test,新建的文件写前面
- tar -vcjf bzip2testtar.bz2 test
- tar -vxjf test.tar.bz2
- rar
- 帮助,rar
- rar a test.rar test
- rar x test.rar
- zip,unzip
- zip test.zip test
- 也可以通过图形化界面进行压缩与解压缩,但是这样比较偷懒
用户与用户组
- 用户分为初次用户、root用户和普通用户。初次用户比普通用户权限大
- sudo vi /etc/password
- sudo gedit /etc/passwd,是用户信息
- sudo gedit /etc/shadow是密码,加密的
- 用户组id,用户组这些说白了就是控制文件的访问权限
- 图形化界面创建用户组
- sudo apt-get install gnome-system-tools
- 代码创建用户和用户组
- adduser 用户名
- finger 用户名
- passwd 用户名
- addgroup 用户组名
- groups 用户组名
- delgroup 用户组名
文件权限
- 文件的三个属性
- 读,r
- 写,w
- 执行,x
- 九个字符
- ---|---|--|,用户|用户组内成员|其他用户
- 修改文件权限命令
- R W X,三位二进制表示为 4 2 1
- chmod 数字 文件名,change the permission mode of the file
- chmod 664 hello
- 编译的话,用gcc hello.c -o hello
- 查看权限,ls 文件 -l
- sudo chown root hello
- sudo chown .root hello
- sudo chown mss.mss hello,同时更改用户和用户组
- sudo chown -r mss.mss 路径,路径下所有的用户和用户组更改
文件连接
-
分为软连接和硬连接,软连接又叫符号连接,
-
inode记录文件属性,一个文件一个inode,类似于文件的ID,查找文件的时候要先找到inode,才能读出文件的内容
-
In命令,是LN,是link的缩写,如果创建符号连接,需要加关键字s,如果是硬连接的话,就不需要s
- In hello.c hello1
-
gcc后面必须紧跟着源文件名字,后缀在源文件名字后面
-
ll -i hello*打印inode
-
硬连接,通过inode连接产生新的文件名,而不是产生新文件
- 硬连接是多个文件指向一个inode,具备相同inode的多个文件互为硬连接文件
- 对于硬连接文件,只有删除了源文件和对应的所有硬连接的文件,文件实体才会被删除
- 硬连接可以防止文件被误删除,不是复制了一份,因为一旦修改其中的一个,其余的都会修改
- 硬连接不能跨文件系统
- 硬连接不常用
-
软连接用的多
-
软连接相当于windows下的快捷方式
-
符号连接最好使用绝对路径,否则会出问题
-
直接cp软连接 相对路径到新的路径的时候,就会变成拷贝新的一份文件
- cp -d hello test/,加上-d就会保持软连接属性
-
ln -s 绝对路径 软连接名称
-
VIM编辑器
- rm指令
- rm hello*
- 安装VIM之后,使用vi打开,
- vi test.txt直接新建并打开
- vim打开有三种模式
- 指令模式/一般模式,默认,不能文本编辑
- dd,删除光标所在的行
- 删除n行,4dd,从光标开始删除4行
- u,撤销操作
- .操作类似F4,重复上一个操作
- yy复制这一行
- 复制多行就是nyy
- p粘贴到光标xiayihang
- P粘贴到光标上一行
- dd,删除光标所在的行
- 编辑模式,按a即可,退出使用Esc
- 如果不正常退出的话,删除.*swap即可
- 命令行模式,一般模式下,输入:即可
- :x,保存退出
- :q,退出
- :w,保存
- :q!退出不保存
- 指令模式/一般模式,默认,不能文本编辑
- 设置vim编辑器进行编程
- sudo vim /etc/vim/vimrc
- 在文本最后,输入set ts =4
- set nu,显示行号
make和Makefile
-
make工具是一个软件,使用gcc编译器,可以自动化编译,只编译修改过的文件
-
Makefile是make使用的文件,决定了编译规则
-
gcc编译多个文件
- gcc 文件1名 文件2名 -o main
- 没有先后顺序
- 第二种语法
- gcc -o main main.c
- gcc -o 新文件名字 旧的文件
- gcc -o main main.c
- gcc 文件1名 文件2名 -o main
-
编译花费时间,但是没修改的编译的话就浪费了时间
-
先编译为.o文件,在连接,如果改了那个就重新.o,再连接
-
.o命令
- gcc -c main,c
-
连接命令
- gcc .o .o .o -o main
- gcc .o文件名 -o 新文件名
- gcc .o .o .o -o main
-
上述原理就是Makefile的原理,Makefile就是这样写的Makefile和makefile都可以
main:main.o input.o calcu.o gcc -o main main.o input.o calcu.o main.o:main.c gcc -c main.c input.o:input.c gcc -c input.c calcu.o:calcu.c gcc -c calcu.c clean: rm *.o rm main
-
编写玩Makefile文件之后,直接执行make命令,它会自动执行Makefile文件的
-
make clean输入这个清除编译出来的文件
-
make重新编译的时候会检查最后的修改日期如果修改了,就会重新编译,否则不编译的
-
Makefile的printf是echo,echo前面加上@表示不输出具体过程
#规则格式:必须使用tab键,不能使用空格,第一条为默认对象,也就是终极目标 目标:依赖项 命令1 命令2 #gcc的时候,为了减少变量的重复输入,可以将变量进行定义 #gcc中只有一种变量类型,就是字符串 object=main.o input.o calcu.o #引用变量的时候采用$(),美元符号加括号的形式 main:$(object) gcc -o main $(object) #赋值符号= #变量先定义,最终数值,取决于最新定义的数值 #赋值符号:= #数值取决于最开始定义的,以后再=赋值不起作用 #赋值符号?= #如果前面没有定义就采用后面的数值,如果定义了,就采用前面的数值 #追加+= #在前面的基础上进行追加 #通配符%,避免相同规则重复书写 #自动化变量,采用$<等等,命令必须采用具体的文件名 #最常用的是: #$@,表示目标集合 #$<,依赖文件,如果是通配符,则代表全部的符合要求的依赖文件 #$^,依赖文件的集合,会去除重复文件 %.o:%.c gcc -c $< # 注意$<已经表示文件全部了,不需要再加后缀名 #伪目标,就是clean那种 #但是存在问题,如果存在clean文件,就不会执行指令了 #所以需要声明为伪目标, .PHONY : clean clean: #这两步之后,不管有没有重名文件,都会执行伪目标
-
shell脚本
- shell脚本就是命令行输入命令,shell脚本类似于windows下的批处理 命令
- 后缀名为.sh,第一行为;第一行必须输入#!/bin/bash
#!/bin/bash
echo "please enter your name"
read name
echo "your name:" $name
read -p "please your age and height" age height
echo "your age is $age,you height is $height"
echo "please enter two int num:"
read -p "first num:" first_num
read -p "second num:" second_num
total=$(($first_num+$second_num))
# 运算符是美元符号,两对括号,其中赋值符号两边不能放空格,否则报错
echo "$first_num+$second_num=$total"
#test命令对数值、字符、文件三方面进行测试
# cmd1 && cmd2,cmd1正确执行才会执行cmd2
# cmd1 ||cmd2,cmd1正确执行就不执行cmd2,否则执行cmd2
echo "please enter filename"
read -p "filename:" filename
test -e $filename && echo "$filename exist" || echo "$filename does not exist"
echo "please enter two string:"
read -p "first string" first_str
read -p "second string" second_str
test $first_str == $second_str && echo "==" || echo "!="
# ==前后必须有空格,否则结果运行不正确
# [] 用来判断字符串是否相等,相当于 test
[ "$first_str" == "second_str" ]
# 首先括号附近得空格;其次字符串必须引号引起来,!=是!和=的组合
[ "$first_str" != "second_str" ]
# $0文件第一个参数 $1 $@参数内容 $#最后一个参数标号,文件本身是$0
./my.sh a b c
#此时 $0 为./my.sh $1为a,$2为b,$3为c,$#表示参数个数3,$@打印所有参数也就是a b c
read -p "please enter(Y/N):" value
if[ "$value" == "y" ] ||[ "$value" == "Y" ];then
echo "your option is Y"
exit 0
fi
if[ "$value" == "N" ] ||[ "$value"== "n" ];then
echo "your option is N"
exit 0
fi
#if 开头fi结束;if 条件 :then;exit 0是结束退出
#双等号前后必须有空格,否则结果运行不正确
#shell 中then前面的是分号
read -p "please enter(Y/N):" value
if[ "$value" == "y" ] ||[ "$value" == "Y" ];then
echo "your option is Y"
exit 0
else
echo "your option is $value"
exit 0
fi
#if else语句中,else后面没有任何符号;但是两个分支都要exit 0
read -p "please enter(Y/N):" value
if[ "$value" == "y" ] ||[ "$value" == "Y" ];then
echo "your option is Y"
exit 0
elif [ "$value" == "N" ] ||[ "$value"== "n" ];then
echo "your option is $value"
exit 0
else
echo "your option can not identify!"
exit 0
fi
#是elif 是elif
#shell case语句
case $变量 in:
"变量1")
语句1
;;
"变量2")
语句2
;;
esac
#末尾以case反过来写结束,每一个语句结束带两个分号,选项只有右边的括号,左上角是esc,他多一个字母a,是esac
1 #!/bin/bash
2 case $1 in #首先$1表示第一个输入的参数,其次in后面没有冒号
3 "a")
4 echo "parameter is a"
5 ;;
6 "b")
7 echo "parameter is b"
8 ;;
9 *) #这直接是*,不能是“*”,这样表示*字符,而不是通配符了
10 echo "cannot identify"
11 ;; #这记得加上两个分号
12 esac
#shell函数
function help(){
echo "this is help cmd!"
}
function close(){
echo "this is close cmd!"
}
case $1 in
"-h")
help #调用函数的时候直接写函数名即可,不需要写参数
;;
"-c")
close #调用函数的时候直接写函数名即可,不需要写参数
;;
esac
#shell函数传参
print(){
echo "parameter 1 is : $1"
echo "parameter 1 is : $2"
}
print a b #传参就是函数名 后面直接加参数,不需要括号
#shell 的while循环
while [ 条件成立 ]
do
循环体
done
while[ "$value" != "close" ]
do
read -p "please enter para:" value
done
echo "while stopped!"
#shell for循环,for循环与while循环一样都是do done循环
for name is mss mss1 mss2 mss3
do
echo "your name is : $name"
done
#shell 类似c语言的for循环
read -p "please enter count:" count
total=0
for ((i=0;i<=count;i=i+1))
do
total=$(($total+$i))
done
echo "1+……+ $count = $total"
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现