linux命令
什么是嵌入式?
以应用为中心,以计算机技术为基础,软件硬件可裁剪,适用于对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统
计算机系统组成?
硬件、软件
操作系统?
ios windows harmony os andriod linux
Linux简介
Linux起源
寻·科普|第二期:聊聊Linux的前世今生
Linux特点 免费开源
Linux优点 模块化程度高、硬件支持广泛、安全稳定、可移植性良好
Linux是什么? 操作系统内核
Ubuntu是什么? Linux发行版
操作系统 内核
Ubuntu Linux
Windows NT
iOS UNIX
Android Linux
查看系统版本
查看Ubuntu版本
sudo lsb_release -a
cat /etc/issue
查看内核版本
uname -r
cat /proc/version
4.15.0-142-generic
4.15.0-142-generic
4:主版本号
15:次版本号
0:修订版本
142:当前版本的142次微调
generic:通用版本
分层结构
应用层:程序、命令
内核层:五大功能:进程管理、设备管理、网络管理、内存管理、文件系统管理
/bin:存放二进制文件,常用命令
/boot:存放linux内核和系统的启动文件
/dev:存放设备文件
/etc:配置文件 passwd存放用户信息
/home:存放所有用户的信息
/mnt:挂载目录
/lib:存放库文件
/proc:存放进程相关文件
驱动层:字符设备驱动、块设备驱动、网络设备驱动
硬件:鼠标、键盘、优盘、硬盘、网卡
系统关机和重启
sudo shutdown -h now 立即关机
sudo shutdown -r now 立即重启
sudo shutdown -h 15 //15分钟后关机
sudo shutdown -h 12:00 //定时关机
sudo shutdown -h 12:00 "提示语"
windows和虚拟机共享文件
1. 直接拖动windows下的文件,到虚拟机终端,mv xxxx .
2. 打开虚拟机文件夹,执行ctrl+c和ctrl+v
3. 通过共享目录的方式:
虚拟机->设置->选项->共享文件夹->添加windows路径
将文件放入共享目录中,在虚拟机/mnt/hgfs/share下可以看到文件
你使用命令" vim /etc/ssh/sshd_config " 查看该文件的内容,你不小心改动了一些内容,为了防止系统出问题,你不想保存所修改的内容,你应该如何操作( )
A:在末行模式下,键入" q! "
B:在命令行模式下,键入" q! "
C:在可视模式下,键入" q! "
D:在编辑模式下,按下ESC键后,键入" :wq! "
软件安装
软件包管理机制
Ubuntu .deb
Windows .exe
Android .apk
redhat .rpm
debian:deb软件包管理机制
redhat:rpm软件包管理机制
查看ubuntu管理机制:sudo vi /etc/apt/sources.list
软件包分类
二进制软件包:xxx.deb
源码包:xxx.dsc 源码、二进制文件、配置文件、说明文档
软件的管理工具
在debian的linux发行版本下采用dpkg 和apt两种包管理工具
dpkg:离线安装,安装本地包,不能检查软件包的依赖关系,不关系仓库内的软件
apt:在线安装,通过仓库获取软件包的资源,解决依赖关系,不能安装本地包。
sl_3.03-17build1_i386.deb
dpkg工具
运行:sl
sudo dpkg -i 软件包名(全称):安装软件
sudo dpkg -s 软件包名:显示软件的安装状态
sudo dpkg -L 软件包名:显示软件的安装路径
sudo dpkg -r 软件包名:卸载软件
sudo dpkg -P 软件包名:完全卸载软件,重新下载不会保留上一次配置。
apt工具
默认安装路径:/var/cache/apt/archives/
sudo apt-get install oneko安装软件
sudo apt-get remove 软件包名:卸载软件
sudo apt-get --purge remove 软件包名:完全卸载软件包
sudo apt-get update:下载更新软件包列表信息
sudo apt-get upgrade:将系统所有软件包升级到最新版本
sudo apt-get clean:清空安装包的存放路径
练习:xeyes 运行 xeyes
xcowsay 运行:xcowsay "hello"
bastet
ubuntu网络配置
- 桥接模式
1)桥接模式:编辑->虚拟网络编辑器->更改设置->选择vmnet0->桥接模式->桥接的网络适配器(根据主机的网络连接进行选择,当然选择自动也可以)->确定
如果自动不行也可以找到对应的网络适配器。
2)虚拟机->设置->网络适配器->选择桥接模式
3)点击图标->Edit connections ->add可以添加->Ethernet->create->ipv4 settings->Method->(可以选择自动获取或手动设置)->save保存即可
如果是手动设置ip,需要点击Method里manual,手动设置ip地址
- nat模式
1)编辑->虚拟网络编辑器->更改设置->选择vmnet8->nat模式->确定。
2)虚拟机->设置->网络适配器->选择nat模式
shell
基础知识
shell:命令行解释器
shell:壳
作用:负责把应用程序的输入命令信息解释给操作系统,将操作系统指令处理后的结果解释给应用程序。
用户在命令行输入命令,先与shell进行交互,shell把用户输入的命令或按键转化成内核所能够理解的指令控制操作系统做出响应,直到控制相关硬件设备。然后,Shell将输出结果提交给用户。
shell版本
1)Bourne Shell(简称sh):Bourne Shell由AT&T贝尔实验室的S.R.Bourne开发,也因开发者的姓名而得名。它是Unix的第一个Shell程序,早已成为工业标准。目前几乎所有的Linux系统都支持它。不过Bourne Shell的作业控制功能薄弱,且不支持别名与历史记录等功能。目前大多操作系统是将其作为应急Shell使用。
别名:给命令再起一个名字 历史记录:上下箭头能找到
2)C Shell(简称csh):C Shell由加利福尼亚大学伯克利分校开发。最初开发的目的是改进Bourne Shell的一些缺点,并使Shell脚本的编程风格类似于C语言,因而受到广大C程序员的拥护。不过C Shell的健壮性不如Bourne Shell。不稳定
3)Korn Shell(简称ksh):Korn Shell由David Korn开发,解决了Bourne Shell的用户交互问题,并克服了C Shell的脚本编程怪癖的缺点。Korn Shell的缺点是需要许可证,这导致它应用范围不如Bourne Shell广泛。需要版权
4)Bourne Again Shell(简称bash):Bourne Again Shell由AT&T贝尔实验室开发,是Bourne Shell的增强版。随着几年的不断完善,已经成为最流行的Shell。它包括了早期的Bourne Shell和Korn Shell的原始功能,以及某些C Shell脚本语言的特性。此外,它还具有以下特点:能够提供环境变量以配置用户Shell环境,支持历史记录,内置算术功能,支持通配符表达式,将常用命令内置简化。
shell命令格式
ls -l test.c
命令名称 选项 参数
选项、参数:可有可无; 选项:-
历史记录
history
家目录下的隐藏文件,可以用vi编辑器打开
~:ls -a
.bash_history 默认保存2000条
history:显示历史命令
history 10:显示10条历史命令
.bashrc:定义HISTSIZE(使用history时默认显示的记录格式)
HISTFILESIZE(.bash_history文件可以存放命令的个数)变量的脚本文件
echo $HISTSIZE :查看HISTSIZE的值
起别名
alias查看系统中起别名的命令
alias 新名字='原来的命令'
unalias hn:取消别名
Linux特殊字符
通配符
通配符 | 含义 | 实例 |
* | 匹配所有字符 | a*b,a与b之间可以有任意长度的字符,也可以没有。 例如:aabcb,ab,azxcb... |
? | 匹配一个字符 | a?b,a与b之间必须但也只能存在一个字符,该字符可以是任意字符。 例如:aab,abb,acb... |
[list] | 匹配list中指定的一个字符 | a[xyz]b,a与b之间必须但也只能存在一个字符,该字符只能是x或y或z。 例如:axb,ayb,azb |
[c1-c2] | 匹配c1-c2间的任意单个字符 | a[0-1]b,a与b之间必须但也只能存在一个字符,该字符只能是数字。 例如:a0b,a1b... |
[^] | 除了其中指定的一个字符,均可匹配 | ab[^z] , ab之后可以匹配除了z的任意字符。 例如: aba abc abf abG ab3... |
管道 |
命令1 | 命令2
命令1的输出作为命令2的输入
补充:wc
wc -l 文件名:查看文件行数
wc -w 文件名:查看文件单词个数(空格隔开单词)
wc -c 文件名:查看字符个数
查看当前路径下单词个数
输入输出重定向
>:输出重定向 新建模式
把要输出的内容,输出到文件里;如果文件不存在,会新建;文件已存在并有内容,内容会被覆盖
命令 &>或者 2>file:会把命令产生的错误输入到file里(用的不多)
>>追加模式
<输入重定向
命令置换符 ` `
esc按键下边`
练习:实现利用管道两个程序交互,./output的输出是./input的输入,input实现输入一句话然后打印
系统维护命令
man
1 Executable programs or shell commands
2 System calls (functions provided by the kernel)
3 Library calls (functions within program libraries)
1 可执行程序或 shell 命令
2 系统调用(内核提供的函数)
3 库调用(程序库中的函数)
su
切换到超级用户su或su root或sudo su
退出:exit
切换到其他普通目录:sudo su 用户名
sudo
临时管理员权限,有时需要输入密码
linux命令
df命令
df -Th:查看磁盘使用情况
文件系统 文件类型 大小 已使用 可用 使用比例 挂载点
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda1 ext4 19G 6.6G 12G 38% /
mount命令
作用:文件系统的挂载
挂载设备:sudo mount -t 设备类型 设备名称 挂载点
卸载设备:sudo umount 挂载点
注意:卸载时不要在挂载点卸载
用户管理命令
添加用户:sudo adduser 用户名
切换:sudo su 用户名
退出:exit
删除用户并删除用户工作目录:sudo deluser --remove-home 用户名
进程管理命令
ps静态
ps -aux:显示系统中正在运行的进程
ps -ef:显示当前系统中运行的进程,包含PPID(父进程号)
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
用户 进程号 终端 进程状态 开启时间 命令
表头 | 含义 |
USER | 该进程是由哪个用户产生的。 |
PID | 进程的 ID。 |
%CPU | 该进程占用 CPU 资源的百分比,占用的百分比越高,进程越耗费资源。 |
%MEM | 该进程占用物理内存的百分比,占用的百分比越高,进程越耗费资源。 |
VSZ | 该进程占用虚拟内存的大小,单位为 KB。 |
RSS | 该进程占用实际物理内存的大小,单位为 KB。 |
TTY | 该进程是在哪个终端运行的。其中,tty1 ~ tty7 代表本地控制台终端(可以通过 Alt+F1 ~ F7 快捷键切换不同的终端),tty1~tty6 是本地的字符界面终端,tty7 是图形终端。pts/0 ~ 255 代表虚拟终端,一般是远程连接的终端,第一个远程连接占用 pts/0,第二个远程连接占用 pts/1,依次増长。?是守护进程,也就是一开始启动时系统在后台运行的进程。(后面IO会讲) |
STAT |
|
START | 该进程的启动时间。 |
TIME | 该进程占用 CPU 的运算时间,注意不是系统时间。 |
COMMAND | 产生此进程的命令名。 |
补充:
grep:从文件中查找字符串
grep "要查找的字符串" 文件名
grep "\<要查找的字符串\>" 文件名:精确查找
思考:精确查找./a.out
top动态查看进程
shift +>:向下翻页
shift+<:向上翻页
q:退出
PR : 优先级
NI:nice值,值越小,优先级越高 [-20,19]
PR=NI+20
修改优先级
sudo renice NI值 PID:改变正在运行的进程的优先级
例:sudo renice 18 8088
sudo nice -n NI值 启动进程的命令:以指定的优先级运行进程
发送信号kill
kill -l:查看系统中定义的信号
2:SIGINT 快捷方式:ctrl+c 结束进程
3:SIGQUIT 快捷方式:ctrl+\ 结束进程
9:SIGKILL 杀死进程
14:SIGALRM:在程序中可以定时,定时结束后产生SIGALRM信号结束进程
15:SIGTERM 结束进程 kill发信号时不加编号,默认信号为15号
18: SIGCONT 让暂停进程继续
19:SIGSTOP: 停止信号,如果发送19号信号也会结束进程
20:SIGTSTP 暂停信号 快捷方式:ctrl+z 暂停信号
kill -num PID : num:信号编号 PID:进程号
网络管理命令
ifconfig:查看linux的ip地址
ipconfig:查看windows的ip地址
win+r打开运行窗口,输入cmd打开命令窗口,输ipconfig
ping 域名/ip地址:检查网络连通性(是否能通信)
例如:ping www.baidu.com
文件系统管理命令
用于组织和管理计算机存储的大量文件,并提供用户交互接口
文件系统分类
1)磁盘文件系统:指本地主机中实际可以访问到的文件系统,包括硬盘、CD-ROM、DVD、USB存储器、磁盘阵列等。常见文件系统格式有:Ext2、Ext3、Ext4、VFAT等
2)网络文件系统:是可以远程访问的文件系统,这种文件系统在服务器端仍是本地的磁盘文件系统,客户机通过网络远程访问数据。常见文件系统格式有:NFS(Network File System,网络文件系统)、Samba(SMB/CIFS)等
3)专有/虚拟文件系统:不驻留在磁盘上的文件系统。常见格式有:TMPFS(临时文件系统)、PROCFS(Process File System,进程文件系统)和LOOPBACKFS(Loopback File System,回送文件系统)。
根文件系统结构
/bin:存放系统常用的命令或可执行文件(二进制文件)
/sbin:存放更多的可执行文件(二进制),包括系统管理、目录查询等关键命令文件
/boot:存放Linux内核和系统启动文件,包括Grub、lilo启动器程序
/opt: 与系统无关的安装程序
/etc: 放的一些配置文件。Linux开机自启动脚本存放在/etc/rc.d或/etc/init.d目录下。这些目录是Linux系统中用于存放启动脚本的标准目录
/dev : 存放所有设备文件,包括硬盘、分区、键盘、鼠标、USB、tty等
/lib : 存放共享的库文件,包含许多被/bin和/sbin中程序使用的库文件
/mnt : 该目录通常用于作为被挂载的文件系统的挂载点
/proc : 存放所有标志为文件的进程,它们是通过进程号或其他的系统动态信息进行标识,例如cpuinfo文件存放CPU当前工作状态的数据
/usr : 用于存放与系统用户直接有关的文件和目录,例如应用程序及支持它们的库文件。以下罗列了/usr中部分重要的目录。
/usr/lib: 库文件,系统默认搜索的库路径
/usr/include: 头文件,系统默认搜索的头文件路径
文件内容显示
1)cat 文件名:显示文件的全部内容到终端
2)head
head 文件名:默认显示前10行
head -n 文件名:显示文件前n行
tail:
tail文件名:默认显示后10行
tail -n 文件名:显示文件后n行
4)find
find 路径 -name "文件名" 在这个路径查询文件
链接文件
文件类型 7种
b:块设备文件 /dev
c:字符设备文件 /dev/input
d:目录文件 文件夹
-:普通文件 .c .h
l:软链接文件
s:套接字文件 <网络编程>
p:管道文件 <IO>
硬链接
利用linux为每个文件分配的物理编号--inode号建立连接。因此,硬链接不能跨越文件系统
软链接(符号链接)
利用文件的路径名建立链接。通常建立软链接使用绝对路径而不是相对路径,以最大限度增加可移植性;类似于windows的快捷方式
硬链接:ln 被链接的文件 生成的链接文件
软链接:ln -s 目标文件 链接文件名
注意:
硬链接:删除或移动目标文件链接依然有效
只能操作普通文件
软链接:删除或移动目标文件链接失效,但是再次创建时,链接依然有效
通常建立软链接使用绝对路径而不是相对路径,以最大限度增加可移植性
硬链接和软链接的区别?
- 创建链接:硬链接利用linux为每个文件分配的物理编号--inode号建立链接;
软链接利用文件的路径名建立链接
- 硬链接只能操作普通文件
- 硬链接:删除或移动目标文件链接依然有效
软链接:删除或移动目标文件链接失效,但是再次创建时,链接依然有
文件压缩和解压
1)zip命令用于将一个或多个文件压缩成一个压缩文件
unzip 命令用于将zip压缩文件进行解压
注意:
1)具有归档功能,并进行压缩
2)可以压缩文件夹,后缀为.zip
3)压缩或解压后原文件依然存在
2)gzip命令用于将一个文件进行压缩。
gunzip命令用于将gzip压缩文件进行解压。
注意:
1)只能对一个文件进行压缩,并自后缀为.gz
2)没有归档功能
3)压缩或解压后源文件不存在
3)bzip2:功能、特点与gzip相同,只是后缀为.bz2
bunzip2:解压
tar
选项:
-x : 释放归档文件,解压
-c : 创建一个新的归档文件,压缩
-v : 显示归档和释放的过程信息
-f : 用户指定归档文件的文件名,否则使用默认名称
-j : 由tar生成归档,然后由bzip2压缩 .tar.bz2
-z : 由tar生成归档,然后由gzip压缩 .tar.gz
注意:
1)具有归档功能,并通过选项可以进行压缩或解压
2)压缩或解压后源文件存在
3)需要写全压缩或解压的文件名格式:
格式:
tar 选项 压缩(解压)文件名 [要压缩的文件列表]
组合:
-cjf:以bz2的格式压缩文件
-czf:以gz的格式压缩文件
-xvf:解压一个压缩包,解压后压缩包依然存在
$tar -czf file.tar.gz *.c
$tar -xvf file.tar.gz
shell脚本
概念
shell的使用方式:手动命令和脚本
shell脚本的本质:shell命令的有序集合
shell不仅是一个应用程序还是一种脚本语言
1)编译型语言:c ,java ,c++ ,当中间出错,err直接结束,修改重新编译运行
2)解释型语言:shell python,不需要编译直接执行,当中间出错,只会在错误的地方报错,但是不会影响后面的内容;解析一条指令,执行一条指令
rwx:可读可写可执行 rw-:可读可写不可执行
r w x r w -
1 1 1=7 1 1 0=6
修改文件或文件夹权限:chmod 777 test.sh
步骤:
创建shell脚本 touch test.sh(文件以.sh结尾);名字无所谓,加上后缀更好区分
一般脚本中添加开头:
#!/bin/bash 以#开头表示注释,告诉操作系统当前脚本使用的bash类型的shell去解析的
ls -l test.sh查看权限,默认对于当前用户没有执行的权限,需要修改
chmod 777 test.sh
运行 ./test.sh或 bash test.sh
练习:
1)在上级目录下创建file1.c file2.c 两个文件
2)将该两个文件移动到家目录
3)将两个文件用tar压缩成gz的格式
linux中一切皆文件
根目录:
/
家目录:多用户
/home/hq ~ cd
下列程序段的输出结果是___Linux________(北京凝思)
#!/bin/bash
var="Welcome to Linux OS"
echo ${var:11:5}
- 写一个"标准"宏MIN,这个宏输入两个参数并返回较小的一个;(富士安全,广域科技,华辰泰尔,鲁科安全,神戎电子,中安云科,中维世纪,晟安信息,苏州特点电子科技)
更改文件权限为"-rwxrw-r-x"的命令(恩易物联)
某文件的权限为:drw-r--r--,用数值形式表示该权限(济南实景互动)
linux中一切皆____,有____种。(鲁科安全)
下面不是对 Linux 操作系统特点描述的是( )(鲁科安全)
- 良好的可移植性 B. 单用户 C. 多用户 D.多任务
如果执行命令,chmod 746 file.txt,那么该文件的权限是( )(鲁科安全、神州安付)
A. rwxr--rw- B. rw-r--r-- C. --xr--rwx D. rwxr--r--
怎样更改一个文件的权限设置?(软通动力)
- A. attrib B. chmod C.change D. file
对名称为test的文件执行chmod551test,则它的权限是(中孚信息、福建新大陆)
A. -rwxr-xr-x B. -r-xr-x--x C. -r--r--r-- D. -rwxr--r-
解释chmod 644 mm.txt命令含义(上海剑桥)
Linux系统中 显示一个文件最后几行的命令是: ( )(软通动力)
A. tac B. tail C. rear D. last
Linux 中的超级用户为root,登陆时不需要口令(判断题)(软通动力)
vim退出不保存的命令是______(神州安付)
A. :q B. q C. :wq D. :q!
你使用命令" vim /etc/ssh/sshd_config " 查看该文件的内容,你不小心改动了一些内容,为了防止系统出问题,你不想保存所修改的内容,你应该如何操作( )
A:在末行模式下,键入" q! "
B:在命令行模式下,键入" q! "
C:在可视模式下,键入" q! "
D:在编辑模式下,按下ESC键后,键入" :wq! "
列出当前目录下所有文件(上海剑桥)
在用vi编辑文件时, 如何保存修改?(济南实景互动
解压 text.tar.gz 文件,需要执行命令___(北京凝思)
如何解压缩后缀是.tar文件______(鲁科安全)
目前流行的两种软件包管理机制,Debian 使用( )软件包,Redhat 使用( )软件包(鲁科安全)
A. tgz B. rpm C. tar D. deb
将前一个命令的标准输出作为后一个命令的标准输入,称之为( )(鲁科安全)
linux下如何安装软件(华辰泰尔)
查看虚拟机硬盘空间使用情况(恩易物联)
建立软链接(快捷方式),以及硬链接的命令。简述他们的区别(恩易物联、鲁科安全、中维世纪)
cat,tail,grep这些指令的含义(深圳三航物联科技有限公司)
变量
用户自定义变量
一般用大写
进行赋值时用=,左右两边不能有空格
引用变量前面加$
位置变量 (命令行参数)
$0与输入的命令行一样,包含脚本名字 xx.sh
$1 , $2 .... $9 :分别包含第一个到第九个命令行参数
$#:命令行参数的个数,不包含脚本文件
$@:所有命令行参数
$*:所有命令行参数
预定义变量
$? 前一个命令的退出状态(0为真,非零为假)
$$ 正在执行进程的ID号
环境变量
变量没有类型
环境变量一般指在操作系统中用来指定操作系统运行环境的一些参数,比如临时文件夹位置、系统文件位置等
HOME /etc/passwd文件中列出的用户的主目录
PATH shell搜索路径,一系列的目录
shell语句
1.说明性语句
以#开始到该行结束,不被解释执行
#!/bin/bash 告诉操作系统使用那种类型的shell执行此脚本文件
2.功能性语句
任意的shell命令、用户程序或其他shell程序
3.结构性语句
条件测试语句、多路分支语句、循环语句、循环控制语句
功能语句
read(类似c语言scanf)
从终端获取值赋值给变量
格式:read 变量名1 变量名2……
read var1 var2 var3
把读入行中的第一个单词(word)赋给var1, 第二个单词赋给var2,
……把其余所有的词赋给最后一个变量
read -p "提示语" 变量名
expr
格式:expr 表达式
算术运算符命令expr主要用于简单的整数运算, 加(+),减(-)乘( \*) 除 (/)取余 (%)
注意:
1)表达式符号之间必须用空格间隔
2)expr引用变量必须$
3)expr自带打印功能
4)使用乘号\* 小括号\( \) 需要转义
- 把expr的结果赋值给变量需要命令置换符
- expr不能进行++ -- 操作
通过expr实现变量自加(++i)
let
let 表达式
- 运算的时候运算符左右两边不能有空格
- 不能自己打印,输出需要用echo
- let语句可以不加$引用变量
- let n=n**2 表示平方
- 可以++ -- ,()转义,*不转义
test
可测试三种对象:字符串 整数 文件属性
每种测试对象都有若干测试操作符
字符串测试
s1 = s2 测试两个字符串是否完全一样
s1 != s2 测试两个字符串是否有差异
-z s1 测试s1长度是否为0
-n s1 测试s1长度是否不为0 //s1为空时返回1,不为空返回0
整数测试
a -eq b 测试a与b是否相等 equal
a -ne b 测试a与b是否不相等 not equal
a -gt b 测试a是否大于b greater than
a -ge b 测试a是否大于等于b greater equal
a -lt b 测试a是否小于b less than
a -le b 测试a是否小于等于b less equal
文件属性测试
测试name 是否为一个目录 -d name
测试name 是否为一个普通文件 -f name
测试name 是否存在 -e name
结构性语句
分支语句
基本结构
if 条件
then
命令表
fi
if 条件
then
命令表1
else
命令表2
fi
嵌套结构
if 条件
then
if 条件
then
命令表2
else
命令表3
fi
else
命令表1
fi
分层结构
if 表达式1
then
命令表1
elif 表达式2
then
命令表2
elif 表达式3
then
命令表3
...
else
表明表n
fi
注意:
if和fi是条件语句的括号,必须组合使用
判断语句其他格式
if [条件]
then
命令表1
else
命令表2
fi
-o 或运算 例如 [ $a -lt 20 -o $b -gt 100 ] 返回 true
-a 与运算 例如 [ $a -lt 20 -a $b -gt 100 ] 返回 false
! 非运算 例如 [ ! false ] 返回 true
&& 逻辑与 例如 [[ $a -lt 100 && $b -gt 100 ]] 返回 false
|| 逻辑或 例如 [[ $a -lt 100 || $b -gt 100 ]] 返回 true
| 位或 例如 echo $[2|2]
&位与 例如 echo $[2&1]
练习:从终端输入3个整数;从小到大排序
case:
格式:
case 变量 in
模式一)
命令表1
;;
模式二)
命令表2
;;
*)
命令表3
;;
esac
注意点 :
1)case语句只能检测字符串变量
2)命令表以单独的双分号行结束,退出case语句
3)如果无一匹配模式,字符* 表示所有其它模式
4)case匹配项中可以存在多个模式,每种模式之间用|隔开
循环语句
格式:
for 变量名 in 单词表
do
命令表
done
执行顺序:变量依次取单词表中的各个单词, 每取一次单词, 就执行一次循环体中的命令. 循环次数由单词表中的单词数确定. 命令表中的命令可以是一条, 也可以是由分号或换行符分开的多条。
1)for i in 1 2 3 4 5 do...done:
变量i的值从单词表中获取
2)for i in {1..10} do...done:
变量i从1-10个数中取值
3)for i do...done:
变量i从命令行取值,可以省略in 单词表
4)for ((i = 0; i < 10; i++)) do...done:
书写格式类似c语言
例:求1-10的和
while do...done
格式:
while 命令或表达式
do
命令表
done
执行顺序:
while语句首先测试其后的命令或表达式的值,如果为真,就执行一次循环体中的命令,然后再测试该命令或表达式的值,执行循环体,直到该命令或表达式为假时退出循环。
循环控制语句
break n:结束n层循环
continue n:结束n层本次循环,继续下次外层循环
break:0 0 0 1 1 0 1 1 2 0 2 1
continue:0 0 0 1 0 3 0 4 1 0 1 1 1 3 1 4 2 0 2 1 2 3 2 4
break 2:0 0 0 1
continue 2:0 0 0 1 1 0 1 1 2 0 2 1
数组
赋值
1)array=(10 9 8 7 6)
2)array1=($1 $2 $3) 命令行传参
3)read a b c
array2=($a $b $c)
4)read -a array3 从终端输入数据到数组中
调用
${array[i]} 数组下标从0~n-1结束,通过下标获取数组元素
array[i]=3 对数组元素重新赋值
${array[@]} 遍历数组
${#array[@]} 计算数组元素的个数
练习:学生成绩管理系统,用shell中的case实现
90-100:A
80-89:B
70-79:C
60-69:D
<60:不及格
- 用shell脚本实现冒泡排序
- 判断当前路径下是否存在目录aa,如果不存在创建;遍历当前路径下的文件,如果是普通文件,将文件复制到aa目录下,并计算文件的个数
先测试aa是不是文件,根据测出的结果决定是否要mkdir;
for in遍历ls运行出来的内容(ls运行结果可以置换一下)
判断是普通文件 执行cp复制;同时可以定义变量++计数