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"
                    
                
                
            
        
浙公网安备 33010602011771号