C高级(linux相关命令,shell脚本编程)

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+1echo"I"
done
while [$I -lt 5]//改成while true 就是死循环了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值