linux
(一) linux软件安装
1.了解不同操作系统的软件包类型。点后缀
windows .exe
android .apk
ubuntu .deb
2.ubuntu使用的是deb软件包
deb软件包分为:
二进制软件包:.deb (安装)
源码包:.dsc (软件源码)
sl_3.03-16_i386.deb
软件名_版本号.次版本号-修订次数_架构.后缀
3.软件包的管理工具:dpkg apt
1)dpkg
特点:
安装软件需要软件的安装包存在,
不能从镜像站点获取软件包,
不能检测软件之间的依赖关系,安装不需要网络。
命令:
sudo dpkg -i 完整的软件包名:安装软件
sudo dpkg -r 软件名 :卸载
sudo dpkg -s 软件名 :查看安装状态
sudo dpkg -P 软件名 : 完全卸载
sudo dpkg -L 软件名 :列出软件文件清单
2)软件包管理工具:apt ==》apt-get apt-cache
特点:
安装软件不需要软件的安装包存在,能从镜像站点获取软件包,
能检测软件之间的依赖关系,安装需要网络。
apt-get:
sudo apt-get install 软件名:下载安装软件
sudo apt-get remove 软件名:卸载软件包
sudo apt-get --purge remove 软件名 :完全卸载
sudo apt-get update :更新软件源
sudo apt-get upgrade :将所有的软件更新为最新版本
sudo apt-get clean:清除下载的软件包
位置:/var/cache/apt/archives
apt-cache命令:查看安装状态、依赖关系
sudo apt-cache show 软件名:获取二进制软件包的详细描述信息
sudo apt-cache policy 软件名:查看安装状态
sudo apt-cache depends 软件名:我依赖的软件
sudo apt-cache rdepends 软件名:那个软件依赖我
4.镜像站点:
(仓库)软件1 软件2 软件2 放到网上---》网址
百度(镜像站点源) 火狐 QQ--》浏览器(服务器)
镜像站点获取不到软件源
(1)找到虚拟机保存源的文件,将文件内的源替换新的源
sudo gedit /etc/apt/source.list
注:修改之前先备份--》
sudo cp /etc/apt/sources.list /etc/apt/sources.list.conf
(2) 网上查找对应ubuntu版本新的源。
https://mirror.tuna.tsinghua.edu.cn/help/ubuntu/
(3) 更新源,新换的源生效
sudo apt-get update
5.安装软件失败的原因:
1.虚拟机没有网络*****
1)检测虚拟机是否可以链接外网:ping 网址或ip地址
ping www.baidu.com
出现以下现象,能通网:
PING www.a.shifen.com (180.101.49.12) 56(84) bytes of data.
64 bytes from 180.101.49.12: icmp_seq=1 ttl=52 time=18.0 ms
64 bytes from 180.101.49.12: icmp_seq=2 ttl=52 time=17.5 ms
2)没有网络,配置网络:
1、选择虚拟机连网方式:桥接模式、Net模式、仅主机模式
编辑-->虚拟机网络适配器:查看到的是三个模式
桥接模式、nat模式 --》可以通外网
仅主机模式--》不通外网
2、配置自动获取ip或设置固定ip
1.编辑--》虚拟网络适配器--》选择桥接模式(自动(不建议))/Net模式--》确定
2.虚拟机--》设置--》硬件--》网络适配器--》模式和前边对应--》确定
3.添加链接的网络:
自动获取ip:
右上角扇形点击--》Eit connections --》add --》name:auto
--》选择ip4 --》method :automatic --》确定。重启网络。
手动设置固定ip:
右上角扇形点击--》Eit connections --》add --》name:manual
--》选择ip4 --》method :manual --》添加固定ip--》DNS--》确定。 重启网络。
6.DNS:域名解析器(解析网址的)
1>将网址解析为ip地址,进行通信,不同运营商,解析器的地址不同。
114.114.114.114
8.8.8.8
识别:IP; 人:身份证号
2>查看ip地址
(1) 虚拟机ip地址的查看:ifconfig
inet addr :ip地址
Mask:子网掩码
Bcast:改网段的广播地址
lo:本地回环地址
127.0.0.1:本机地址
(2) windows的ip地址:
win+r: 输入 cmd -->windows终端界面
ipconfig:查看windows的ip地址
ping通对方:表示双方机器可以通过网络通信(不借助第三方软件)
(二)linux解压和压缩 tar
选项:
-x : 释放归档文件
-c : 创建一个新的归档文件
-v : 显示归档和释放的过程信息
-f : 用户指定归档文件的文件名,否则使用默认名称 后跟文件名
-j : 由tar生成归档,然后由bzip2压缩 .bz2
-z : 由tar生成归档,然后由gzip压缩 .gz
-J : 由tar生成归档,然后由xz压缩 .xz
注意:
1)具有归档功能,并通过参数可以进行压缩或解压
2)压缩或解压后源文件存在
3)需要写全压缩或解压的文件名格式:
格式:
tar 选项 压缩(解压)文件名 [要压缩的文件列表]
组合:
-cjf :以bz2的格式压缩文件
-czf :以gz的格式压缩文件
-cJf : 以xz的格式压缩文件
注意 : jz 在f 前; 压缩后源文件依然存在
-xvf : 解压一个压缩包; 解压后压缩包依然存在
eg: 压缩
tar -cvjf file.tar.bz2 *.c
tar -cvJf file.tar.xz *.c
tar -cvzf file.tar.gz *.c
注意::tar -cvf file.tar *.c -->只归档不压缩
解压:tar -xvf xxxx.tar.gz
总结:
压缩: tar -cvzf file.tar.gz *.c
解压: tar -xvf xxxx.tar.gz
XXXX.zip unzip XXXX.zip
(三)linux进程相关命令
32位操作系统
进程:就是程序的一次执行过程。(动态)
程序:在磁盘空间上存放的可执行的二进制文件。(静态)
内核--》0-4G虚拟内存空间
进程id(pid),pid唯一标识进程。
cpu资源、产生一个描述进程的结构体(保存进程相关信息)。
0-4G虚拟内存空间:0-3G--》私有内存空间
3-4G:公用内核空间 (驱动,进程间通信)
1.ps命令 --》运行终端的pid
pid -->标记进程的(进程的身份证)
ps -aux :查看进程的信息
用户 进程id TTY:运行是否依赖终端 状态 名称
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.2 25152 4308 ? Ss 2月13 0:06 /sbin/init splash
root 2 0.0 0.0 0 0 ? S 2月13 0:00 [kthreadd]
ps -ef :查看信息包含父进程的进程号 PPID
子进程使用的是父进程的资源(空间,库等)
8核(A53):可以同时运行8个进程(进程创建)
ps -ajx:可以查看 (父进程id 组id 会话id)
多个进程可以组成一个组,多个组可以组成一个会话,
多个会话可以组成一个会话组。
./a.out & :将a.out在后台运行起来
Ctrl+z:将前台运行的进程暂停同时放到后台
bg 数字(这里的数字为你按Ctrl+Z的时候前面中括号里面的数字):将后台暂停的进程在后台跑起来。
fg 数字 :将后台运行的进程拉到前台运行
jobs:查看后台的进行
man ps:
D: uninterruptible sleep (usually IO) 不可中断睡眠
R: running or runnable (on run queue) 运行
S: interruptible sleep (waiting for an event to complete) 可中断睡眠
T: stopped by job control signal 暂停
X: dead (should never be seen) 死亡
Z: defunct ("zombie") process, terminated but not reaped by its parent 僵尸
<: high-priority (not nice to other users) 高优先级
N: low-priority (nice to other users) 低优先级
L: has pages locked into memory (for real-time and custom IO)锁定到内存中
s: is a session leader 会话组组长
l: is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)多线程
is in the foreground process group 前台进程
D: 不可中断的静止
R: 正在执行中
S: 阻塞状态
T: 暂停执行
Z: 不存在但暂时无法消除
W: 没有足够的内存分页可分配
<: 高优先级的进程
N: 低优先级的进程
L: 有内存分页分配并锁在内存中
2.top 动态显示进程的状态 (动态看进程占用CPU)
1.shift + >
shift + <
PR:PR=NI+20
NI:优先级 +19 - - -- - -20
值越小优先级越高
3.nice 以指定优先级运行进程
sudo nice -num ./可执行程序 :以优先级为num运行程序
eg: sudo nice -3 ./可执行程序 程序以3优先级运行
sudo nice --3 ./可执行程序 程序以-3优先级运行
4.renice 运行进程优先级修改
sudo renice num PID
eg: sudo renice 3 PID PID对应的进程优先级改为3
sudo renice -3 PID PID对应的进程优先级改为-3
5.kill 给进程发送信号
kill -l :查看linux中的信号
2) SIGINT ctrl+c
9) SIGKILL 杀死进程信号
19) SIGSTOP 暂停
2) SIGINT 3) SIGQUIT 退出进程 4) SIGILL结束进程
9) SIGKILL杀死(不可忽略) 10) SIGUSR1未定义功能
12) SIGUSR2未定义功能 13) SIGPIPE管道破裂 14) SIGALRM定时信号
17) SIGCHLD子进程状态改变给父进程发 19) SIGSTOP暂停(不可忽略)
SIGUSR1 SIGUSR2 未定默认功能信号
kill -信号编号 PID :给指定进程发送指定信号
killall a.out :杀死所有名字为a.out
(四)linux文件系统命令
1.文件系统类型:
1)磁盘文件系统:硬盘、U盘
文件系统的格式有:ext、ext2、ext3、ext4、vfat、fat32...
2)网络文件系统:nfs服务、samba(不存在文件形式)(socket)
3)虚拟文件系统:tmpfs
作用:tmpfs(临时)如果你的虚拟机出现
2.file 文件名 :查看文件的类型(源文件、可执行文件)
3.rm -f :强制删除,文件存不存在都会删除
4.cat 文件名 :将文件内容输出到终端
cat -n 文件名:将文件内容及行号输出到终端
5.head 文件名 :默认输出文件内容前10行
head -num 文件名:将前num行内容输出到 终端
6.tail 文件名:默认输出文件内容最后的10行
tail -num 文件名 :将后num行内容输出到终端
7. find 文件的查找
find 路径 -name “文件名”
find ./ -name “1.txt”
//从当前目录下搜索1.txt文件
8.echo命令
echo 字符串:把字符产输出到终端
echo -n 字符串 :不换行
9:df -h :查看虚拟机硬盘空间使用情况
10:lscpu :显示CPU信息
11:free -g:显示内存的使用情况
# free
total used free shared buff/cache available
Mem: 1882892 785272 280428 40496 817192 852060
Swap: 0 0 0
先说明一些基本概念
第一列
Mem 内存的使用信息
Swap 交换空间的使用信息
第一行
total 系统总的可用物理内存大小
used 已被使用的物理内存大小
free 还有多少物理内存可用
shared 被共享使用的物理内存大小
buff/cache 被 buffer 和 cache 使用的物理内存大小
available 还可以被 应用程序 使用的物理内存大小
(五)嵌入式系统****(把软件嵌入到硬件)
以计算机应用为中心,软硬件可裁剪,
**对功耗、体积、性能等都有一定要求的专用计算机系统。
手机;
硬件+系统(安卓、鸿蒙、iOS)
安卓(Android)
是一种基于Linux内核(不包含GNU组件)的自由及开放源代码的操作系统。
Linux:(代码增加、删除)
真实物理机(电脑)
**硬件 + BIOS(第一段启动代码:初始化部分硬件(USB驱动))
+ win7、10、11(win内核+根文件系统)
**硬件+uboot+Linux内核+根文件系统(Linux)+应用
不同操作系统的内核:
windows NT
android linux
macOs ios unix
ubuntu linux
redhat linux
1.linux 特点
linux开源,免费使用,内核源码开源,针对商业非免费。
linux多用户、多任务、分时操作系统,是软硬件可裁剪的操作系统。
linux可以移植到不同的硬件设备上,支持的硬件比较多。
2.linux体系架构(内核机构) *****
while(1); 命令行(ctrl+c:把正在运行的进程给杀死)
ctrl+c -》Linux底层知道(信号)
应用层: app shell命令
| |
c库(函数接口) |shell解析器
| |
---------系统调用-------------------
**内核层:五大功能
进程管理
内存管理
设备管理(驱动准确) Linux 下一切皆文件(字符设备,块设备》open)
文件管理
/ -->根文件系统下的每个文件都有自己特定功能
网络管理 (网卡设备(socket))
硬件层:鼠标 键盘
硬件怎么能使用(必须要有驱动
**c库:一套标准输入输出函数接口,
是在系统调用之前做的二次封装,可以
在所有的操作系统上使用。(标准IO)
if(是windows)
windows的系统调用函数接口
if(linux )
linux系统调用函数接口......
**系统调用:是内核向上提供的函数接口,基于内核,
不同的操作系统内核不同,系统调用函数接口不同。
(六)make工具
1.工程管理器,顾名思义,是指管理较多的文件
Make工程管理器也就是个“自动编译管理器”,这里的“自动”
是指它能构根据文件时间戳自动发现更新过的文件而减少
编译的工作量,同时,它通过读入Makefile文件文件的内容
来执行大量的编译工作。
gcc ->
make ->Makefile(gcc 编译步骤去写)
2.make工具的作用
当项目中包含多个c文件,但只对其中1个文件进行了修改,
那用gcc编译会将所有的文件从头编译一遍,这样效率会非常低;
所以通过make工具,可以查找到修改过的文件(根据文件时间戳),
只对修改过的文件进行编译,这样大大减少了编译时间,
提高编译效率
3.Makefile的编写格式
格式:
目标:依赖
<tab> 命令
add:add.o main.o
gcc add.o main.o -o add
add.o:add.c
gcc -c add.c -o add.o
main.o
add.c main.c
gcc add.c main.c -o add
目标实现,需要通过依赖文件实现
可以只有目标没有依赖。
1>有目标没有依赖
make执行Makefile文件内的指令,
执行"make"默认执行的是第一个目标
对应的命令。若想执行剩余的目标,需要 "make 目标"执行。
.PHONY:clean -->.PHONY
声明一个伪命令。若之前的目标中有生成可知执行文件名为clean。
执行“make clean”时,make会认为clean目标已实现。不执行clean
目标对应的指令,用.PHONY声明后,make认为clean是一个指令,
“make clean”时会执行clean指令对应的命令。
2>有目标有依赖
目标:依赖
<tab>命令
一般是多个文件实现一项工程。对多个.c文件的管理。
3.变量
$HOME ($:表示取值)
HOME=/home/hq
1. 预定义变量
CC 默认值为cc,与gcc同
RM 默认值为rm -f
CFLAGS 无默认值,一般为c编译器的选项
OBJS 一般为目标文件xx.o
1)机器上面运行的是源码?还是可执行文件?
可执行文件
2)在虚拟机上面编写代码,在虚拟机上面执行代码
(编写代码和执行代码在同一个架构上)
3)架构:
win:X86
公司的产品:ARM架构;
4)在X86架构上编写和编译代码,在ARM架构上执行代码
交叉开发(编写代码、编译代码和执行代码的架构不一样)
编译代码的时候要使用交叉编译工具链去编译代码
gcc 交叉编译工具链->
2. 自动变量:
$< 第一个依赖文件的名称
$@ 目标文件的完整名称
$^ 所有不重复的目标依赖文件,以空格分开
%.o:%.c :表示所有的.o依赖与所有的.c
shell
(一)认识shell
1.命令行解析器。
2.shell解析器版本:sh、csh、ksh、bash
3.shell、内核、硬件、用户之间的关系:*****
1)用户从命令行提示终端输入命令或者按键,提交给shell。
2)shell将命令转换为内核可以识别的指令。
3)内核驱动硬件设备实现对应指令功能,将执行结果提交给shell。
4)shell将反馈的结果解释提交给用户识别。
(二)shell的特殊字符*****
1.通配符
*:匹配任意长度字符
*2.管道 |
**将一个命令的输出作为另一个命令的输入
** cat test.c | wc -l
cat -n test.c | grep "hello"
**ps -aux | grep "a.out"
wc:
wc -l 文件名:查看文件的行数
wc -w 文件名:查看文件单词个数
wc -c 文件名:文件字符个数
wc -m 文件名:文件大小
**grep:查询文件中的字符串
grep “字符串” 文件名
grep -n “字符串” 文件名 :显示行号
eg:grep "printk" * -nR
printf ->man 3 printf
printk ->在Linux内核里搜:grep "printk" * -nR
**3.输入输出重定向
*> file : 将file重定向为输出源,新建模式
*>>file : 将file重定向为输出源,追加模式
<
<<
** 4.命令置换符 `` 在Esc键下
命令置换:``(Esc键下的)(不是单引号)
** 将一个命令的输出作为另一个命令的参数。
如:ls `pwd`(将pwd的执行结果作为ls的参数)
echo "user is `whoami`" 显示user is Linux
echo "Today is `date`" 显示Today is ......
(可以写成这样:echo "Today is $(date)")
ctime()获取系统时间;
*echo $HOME
*printenv:显示Linux下自带的环境变量
*当命令行输入echo $HOME时候,就会出现/home/hq.
(三)Shell基本系统命令
*1.man
man man:查看man手册功能
第一章节:shell命令
第二章节:系统调用
第三章节:C库(库函数)
*2.sudo passwd 用户名:修改用户密码
*3.su 切换用户
su: 默认切换到root
sudo su 用户名:切换到指定用户
exit :退出切换的用户
(四) 硬链接和软连接
1》 软链接
ln -s (符号链接) 利用文件的路径名来建立的,
最好从绝对路径开始(增加可移植性)
ln -s 被链接的文件(源文件) 生成的链接文件(目标文件)
ln -s /home/hq/Desktop/test/1.c softlink.txt
1) 软链接的属性是l 相当于快捷方式
2)源文件删除,链接断开,建立源文件之后重新链接
3)软链接可以链接目录
4)修改内容都变化
电脑、笔记本 ->物理机
2》硬链接 ln
根据linux系统分配给文件的inode号(物理编号)=(真实存在的编号)
(ls -i)进行建立的,没办法跨越文件系统
ln 被链接的文件(源文件) 生成的链接文件(目标文件)
1)硬链接的属性是- 相当于生成一个副本 起别名
2)源文件删除链接依然存在
3)不能链接目录
4)修改内容都变化
路径权限:只读权限 可读可写 (a.out)
./a.out
lsp-cbd
l:软链接文件
(五)shell脚本编程
shell--》解析器:sh ksh csh bash
shell脚本:本质--》shell命令的有序集合
shell脚本编程:
将shell命令按照一定的逻辑顺序实现指定功能,
放到一个文件中文件叫脚本文件,后缀.sh,可以直接执行,
不用编译。
shell脚本语言--》解释型语言
写一个shell脚本文件步骤:
1.创建一个脚本文件
touch xxx.sh
2.将脚本文件权限修改为可执行
chmod 777 xxx.sh
3.编辑脚本内容
vi xxx.sh
4.执行脚本文件
./xxx.sh 或者 bash xxx.sh
(六)shell变量
1.shell中允许建立变量存储数据,但是不支持数据类型,
(如:整型、字符、浮点类型),
所有赋值给变量的值都解释为一串字符。
2.变量的定义格式
变量名=值
注:等号两边都不能有空格。
取shell变量的值:$变量名
3.shell变量的分类
1)环境变量 printenv 或 env
HOME=/home/hq
2)用户自定义变量
在shell编程中通常定义的变量名用大写,变量的调用:
$变量名
Linux Shell/bash从右向左赋值
如:Y=yy
X=$Y
echo $X //输出yy
使用unset命令删除变量的赋值
如:X=xx
unset X
echo $X //没有任何输出
3)位置变量或命令行参数
$0 执行的脚本名
$1-$9、${10}-${n} 命令行空格传的参数
$# 命令行参数个数,除$0
$@ $* 遍历输出命令行参数内容
4)预定义变量
$? 获取的是上一句命令是否正确执行的结果
0:真 非0:为假
$$ 获取进程pid
4.shell中的语句
1)说明性语句
以#号开始到该行结束,不被解释执行(注释)
#!/bin/bash
告诉操作系统使用哪种类型的shell执行此脚本文件
2)功能性语句
任意的shell命令、用户程序或其它shell程序。
3)结构性语句
条件测试语句、多路分支语句、循环语句、循环控制语句等
5.功能性语句
1.read (类似c中scanf)
从终端获取值赋值给变量。
格式:read 变量名1 变量名2 ...
加提示语句:read -p “提示字符串” 变量名1 变量名2 ...
注:把终端读入空格隔开的第一个单词赋值给第一个变量,第二个
单词赋值给第二个变量,依次类推赋值,剩余所有单词赋值
给最后一个变量。
2.expr
算术运算命令expr主要用于进行简单的整数运算,
包括加(+)、减(-)、乘(\*)、整除(/)和求模(%)等操作
如:expr \( 12 + 3 \) \* 2
NUM=`expr 12 + 3` :将运算的结果赋值给变量
注意:
1)运算符左右两侧必须有空格
2)*和()必须加转义字符,\* 、 \( \)
3)expr语句可以直接输出运算结果
3.let
在运算中不能有空格
运算结果需要赋给一个变量
变量参与运算的过程不用加$取值
如:
Let r=(1+3)*2
Let r+=1 // ((r++))
4.test
test语句可测试三种对象:
字符串 整数 文件属性
每种测试对象都有若干测试操作符
1)字符串的测试:(等号两边加空格)
s1 = s2 测试两个字符串的内容是否完全一样
真,假
echo $?
s1 != s2 测试两个字符串的内容是否有差异
-z s1 测试s1 字符串的长度是否为0
-n s1 测试s1 字符串的长度是否不为0
2)整数的测试:
a -eq b 测试a 与b 是否相等
a -ne b 测试a 与b 是否不相等
a -gt b 测试a 是否大于b
a -ge b 测试a 是否大于等于b
a -lt b 测试a 是否小于b
a -le b 测试a 是否小于等于b
3)文件属性的测试;
-d name 测试name 是否为一个目录
-f name 测试name 是否为普通文件
-e name 测试文件是否存在
6.结构性语句:
1.if…then…fi
1)基本结构:
if 表达式
then
命令表
fi
如果表达式为真, 则执行命令表中的命令;
否则退出if语句, 即执行fi后面的语句。
if和fi是条件语句的语句括号, 必须成对使用;
命令表中的命令可以是一条, 也可以是若干条。
例如:
#!/bin/bash
if [ -e $1 ]
then
echo “$1 exist”
exit;
fi
下面两种方式等价
//
if test -f $filename
then
fi//
//if [ -f $filename ]
then
fi//
2)分层结构1:
if 表达式
then
命令表1
else
命令表2
fi
例如:vi if2.sh
if [ $# -ne 1]
then
echo "ne"
exit
fi
分层结构2:
if 表达式1
then
命令表1
elif 表达式2
then
命令表2
elif 表达式3
then
命令表3
else
命令表4
fi
if a== 3
b == 4;
3)嵌套结构:
if 表达式
then
命令表1
else
if 表达式
then
命令表
fi
fi
注意:
如果表达式为真, 则执行命令表中的命令;
否则退出if语句, 即执行fi后面的语句。
if和fi是条件语句的语句括号, 必须成对使用;
命令表中的命令可以是一条, 也可以是若干条。
2.case...esac
case 字符串变量 in
模式1)
命令表1
;;(相当于C语言中的break)
模式2)
命令表2
;;
……
*)
命令表n
;;
esac
注意:
1)case语句只能检测字符串变量
2)命令表以单独的双分号行结束,退出case语句
3)模式 n常写为字符* 表示所有其它模式
4)case匹配项中可以存在多个模式,
每种模式之间用|隔开
例如:
vi case1.sh
#!/bin/bash
echo "please choose (yes|no)?"
read R
case $R in
yes)
echo "yes"
;;
y)
echo "yes"
;;
no)
echo "no"
;;
*)(相当于C语言中的default,
所以下面的两个分号可以去掉
(C语言中的default中的break也是可以省略的。))
echo "wrong"
;;
esac
当多种放一起的时候,只需要输出一条提示语句时候,这样写:
#!/bin/bash
echo -n "please choose (yes|no)?"
read R
case $R in
yes | Yes | y |Y )(当多种放一起的时候,只需要输出一条提示语句时候)
echo "yes"
;;
no)
echo "no"
;;
*)
echo "other"
;;
esac
补充:
逻辑运算符的书写格式:
|| :逻辑或
[ 表达式1 ] || [ 表达式2 ]
[ 表达式1 -o 表达式2 ]
&& :逻辑与
[ 表达式1 ] && [ 表达式2 ]
[ 表达式1 -a 表达式2 ]
! :逻辑非
[ ! 表达式 ]
3.for..do..done
格式:
for 变量名 in 单词表
do
命令表
done
变量依次取单词表中的各个单词,每取一次单词, 就执行一次循环体中的命令.
循环次数由单词表中的单词数确定.
命令表中的命令可以是一条, 也可以是由分号或换行符分开的多条。
for语句的几种书写格式:
1)for i in 1 2 3 4 do....done :
变量i从单词表中取值
例如:
一:
for I in 1 3 5 7 9 // for I in `seq 1 2 10`
(1是起始数字,10是终止数字,2是增加的数字,及两个数之间差值为2)
do
echo "$I"
done
这样就打印出了1 3 5 7 9
2)for i do...done:
变量i从命令行取值,可以省略in 单词表
3)for i in {1..10} do...done:
(大括号和数字之间不加空格)
变量i从1~10
4)for ((i = 0; i < 10; i++)) do...done
do
echo "I=$I"
done
shell脚本的死循环
(1) for((;;))
do
echo "for"
done
(2)
while true
do
echo "while"
done
4.while…do…done:
格式:
while 命令或表达式
do
命令表
done
while语句首先测试其后的命令或表达式的值,
如果为真,就执行一次
然后再测试该命令或表达式的值,
执行循环体,直到该命令或表达式为假时退出循环。
写while的表达式时候,表达式与中括号之间加空格
#!/bin/bash
I=0
while [ $I -lt 5 ]
do
I='expr
I
+
1
′
e
c
h
o
"
I + 1' echo "
I+1′echo"I"
done
while [$I -lt 5]//改成while true 就是死循环了。