Linux-开发与管理 P1 shell编程

嵌入式开发 同时被 2 个专栏收录
29 篇文章 0 订阅

Linux-开发与管理 P1 shell编程

在这里插入图片描述

shell基础

在这里插入图片描述

shell简介

什么是shell?

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁
Shell 既是一种命令语言,又是一种程序设计语言
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务

在这里插入图片描述

shell翻译成中文就是贝壳的意思,它就是Linux内核的一个外层保护工具,并负责完成用户与内核之间的交互

shell能用来干什么?

shell是一个命令行解释器,将用户命令解析为操作系统所能理解的指令,从而实现用户与操作系统的交互。同时,shell为操作系统提供了内核之上的功能,直接用来管理和运行系统。

shell历史

在这里插入图片描述
这是shell发展的时间图,这里主要来了解几种比较常用和熟悉的

Bourne Shell简称sh

由AT&T贝尔实验室的S.R.Bourne开发,也因开发者的姓名而得名,他是第一个shell程序,几乎所有的Linux系统都支持它。但是其作业控制功能薄弱,大多数操作系统将其作为应急shell使用

Bourne Again Shell简称bash
在1987年由布莱恩·福克斯为了GNU计划而编写。1989年发布第一个正式版本,原先是计划用在GNU操作系统上,但能运行于大多数类Unix系统的操作系统之上,包括Linux与Mac OS X v10.4都将它作为默认shell
Bash是一个命令处理器,通常运行于文本窗口中,并能执行用户直接输入的命令

在这里插入图片描述

C shell简称csh

Bill Joy于20世纪80年代早期,在Berkeley的加利福尼亚大学开发了C shell。它主要是为了让用户更容易的使用交互式功能,并把ALGOL风格的语法结构变成了C语言风格。它新增了命令历史、别名、文件名替换、作业控制等功能

Korn shell简称ksh

它由贝尔实验室的David Korn在二十世纪八十年代早期编写。它完全向上兼容 Bourne shell 并包含了 C shell 的很多特性

命令格式

在Linux的shell命令可以直接在终端里进行输入,也可以创建.sh结尾的shell脚本文件进行编写,关于shell脚本会在后面讲到,这里先阐述shell命令在终端的使用方式

在这里插入图片描述

例如一个终端输入命令之前,会显示一些信息

username@hostname:direction$

username:用户名,显示当前登录用户的账户名,这里的用户名是linux,切换账户后就会更换为现在登入的用户名

hostname:主机名,显示登录的主机名

direction:目录名,显示当前所在的路径(“/”表示显示在根目录下)


现在输入shell命令

在这里插入图片描述

shell命令的基本形式

$ command [-options] argument

shell命令一般由三个部分组成

command命令名称,shell命令或程序(严格区分大小写),这里使用了ls指令,用于显示指定目录下的内容

options命令选项,用于选择命令的执行方式等不同功能的选择,可以同时选择多个功能。这里使用了-a,表示显示所有文件及目录

argument命令参数,命令作用的对象或者目标,有时候可以没有参数,有时候也可以带多个参数

linux命令

在这里插入图片描述

了解完如何写shell命令之后,就来了解一下都有哪些命令,下面做了简要分类,并列举其中的几个常用和重要的命令;这里将命令分为文件文档相关磁盘相关网络通信系统设备相关压缩相关,关于命令除了下面讲到的还有很多,这里就不一一列举,如果有机会专门写一篇文章来讲

文件文档相关

文件管理

cat

内容
命令名称cat
命令格式cat [OPTION] [FILE]
命令功能连接文件并打印到标准输出设备上
OPTION-n 由 1 开始对所有输出的行数编号
-b 和 -n 相似,只不过对于空白行不编号
-s 当遇到有连续两行以上的空白行,就代换为一行的空白行
FILE指定目录(为空是当前目录)

在这里插入图片描述

加上-n,会列出行数编号

在这里插入图片描述

加上-b,会列出不为空白行的编号

在这里插入图片描述

加上-s试试

在这里插入图片描述


chgrp

内容
命令名称chgrp
命令格式chgrp [-option] [所属群组] [文件或目录]
命令功能变更文件或目录的所属群组
-option-c:详尽地描述每个file实际改变了哪些所有权
-f:显示全部错误信息
-h:只对符号连接的文件作修改,而不更动其他任何相关文件
-R:递归处理,将指定目录下的所有文件及子目录一并处理
-v:显示指令执行过程
所属群组选择文件变更的群组的名字
文件或目录变更群组的文件或目录

将文件的群组变更

在这里插入图片描述


chown

内容
命令名称chown
命令格式chown [-option] [权限] [文件或目录]
命令功能改变文件的访问权限
-option-c : 若该文件权限确实已经更改,才显示其更改动作
-f : 若该文件权限无法被更改也不要显示错误讯息
-v : 显示权限变更的详细资料
-R : 对目前目录下的所有文件与子目录进行相同的权限变更
权限改变的文件的权限
文件或目录改变的文件或目录

在这里插入图片描述


mv

内容
命令名称mv
命令格式mv [OPTION] 文件名 文件名 将源文件名改为目标文件名
mv [OPTION] 文件名 目录名 将文件移动到目标目录
mv [OPTION] 目录名 目录名 目标目录已存在,将源目录移动到目标目录
命令功能用来为文件或目录改名或将文件或目录移入其他位置
OPTION-i 若指定目录已有同名文件,则先询问是否覆盖旧文件
-f 在mv操作要覆盖某已有的目标文件时不给任何指示

详细功能以在P1中讲解过


rm

内容
命令名称rm
命令格式rm [OPTION] [FILE]
命令功能删除一个文件或目录
OPTION-i 删除前逐一询问确认
-f 即使原档案属性设为唯读,亦直接删除,无需逐一确认
-r 将目录及以下之档案亦逐一删除(用于删除目录)
FILE指定目录(为空是当前目录)

详细功能以在P1中讲解过


touch

内容
命令名称touch
命令格式touch [OPTION] [FILE]
命令功能创建一个文件或修改文件的属性
OPTION-a 改变档案的读取时间记录
-m 改变档案的修改时间记录
-c 假如目的档案不存在,不会建立新的档案
-f 不使用,是为了与其他 unix 系统的相容性而保留
-r 使用参考档的时间记录,与 --file 的效果一样
-d 设定时间与日期,可以使用各种不同的格式
-t 设定档案的时间记录
FILE指定目录(为空是当前目录)

详细功能以在P1中讲解过


cp

内容
命令名称cp
命令格式cp [OPTION] sourse dest
命令功能用于复制文件或目录
OPTION-a 此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容
-d 复制时保留链接
-f 覆盖已经存在的目标文件而不给出提示
-i 与-f选项相反,在覆盖目标文件之前给出提示,要求用户确认是否覆盖
-p 除复制文件的内容外,还把修改时间和访问权限也复制到新文件中
-r 若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件
-l 不复制文件,只是生成链接文件
sourse源文件地址
dest目标文件地址

详细功能以在P1中讲解过


文档编辑

ex

内容
命令名称ex
命令格式ex [选项][参数]
命令功能-b:使用二进制模式编辑文件
-c 指令:编辑完第一个文件后执行指定的指令
-d :编辑多个文件时,显示差异部分
-m :不允许修改文件
-n :不使用缓存
-oN:其中 N 为数字
-r :列出缓存,并显示恢复信息
-R :以只读的方式打开文件
-s :不显示任何错误信息
-V :显示指令的详细执行过程
–help :显示帮助信息
–version :显示版本信息

look

内容
命令名称look
命令格式look [-adf][-t<字尾字符串>][字首字符串][字典文件]
命令功能-a 使用另一个字典文件web2,该文件也位于/usr/dict目录下
-d 只对比英文字母和数字,其余一慨忽略不予比对
-f 忽略字符大小写差别
-t<字尾字符串> 设置字尾字符串

wc

内容
命令名称wc
命令格式wc [-clw][–help][–version][文件…]
命令功能-c或–bytes或–chars 只显示Bytes数
-l或–lines 只显示行数
-w或–words 只显示字数
–help 在线帮助
–version 显示版本信息

文件传输

ftp

内容
命令名称ftp
命令格式ftp [-dignv][主机名称或IP地址]
命令功能-d 详细显示指令执行过程,便于排错或分析程序执行的情形
-i 关闭互动模式,不询问任何问题
-g 关闭本地主机文件名称支持特殊字符的扩充特性
-n 不使用自动登陆
-v 显示指令执行过程

tftp

内容
命令名称talk
命令格式talk person [ttyname]
命令功能person : 预备对谈的使用者帐号,如果该使用者在其他机器上,则可输入
person@machine.namettyname : 如果使用者同时有两个以上的 tty 连线,可以自行选择合适的 tty 传讯息

磁盘相关

cd

内容
命令名称cd
命令格式cd [dirname]
命令功能用于切换当前目录到目标目录
dirname要切换的目标目录

mkdir

内容
命令名称mkdir
命令格式mkdir [OPTION] dirname
命令功能建立名为dirname的子目录
OPTION-m 设置建立模式
-p 确保目录名称存在,不存在的就建一个
-v 为每个创建的文件夹打印一条消息
dirname文件夹的名称

ls

内容
命令名称ls
命令格式ls [OPTION] [FILE]
命令功能显示指定工作目录下的内容
OPTION-a 显示所有文件及目录
-l 除文件名称外,将文件型态、权限、拥有者、文件大小等资讯详细列出
-r 将文件以相反次序显示(原定依英文字母次序)
-t 将文件依建立时间之先后次序列出
-R 若目录下有文件,则以下之文件亦皆依序列出
FILE指定目录(为空是当前目录)

网络通讯

wall

内容
命令名称wall
命令格式wall [ message ]
命令功能Linux wall命令会将讯息传给每一个 mesg 设定为 yes 的上线使用者

ping

内容
命令名称ping
命令格式ping [-dfnqrRv][-c<完成次数>][-i<间隔秒数>][-I<网络界面>][-l<前置载入>][-p<范本样式>][-s<数据包大小>][-t<存活数值>][主机名称或IP地址]
命令功能-d 使用Socket的SO_DEBUG功能
-c<完成次数> 设置完成要求回应的次数
-f 极限检测。-i<间隔秒数> 指定收发信息的间隔时间
-I<网络界面> 使用指定的网络接口送出数据包
-l<前置载入> 设置在送出要求信息之前,先行发出的数据包
-n 只输出数值。-p<范本样式> 设置填满数据包的范本样式
-q 不显示指令执行过程,开头和结尾的相关信息除外
-r 忽略普通的Routing Table,直接将数据包送到远端主机上
-R 记录路由过程。-s<数据包大小> 设置数据包的大小
-t<存活数值> 设置存活数值TTL的大小
-v 详细显示指令的执行过程

talk

内容
命令名称talk
命令格式talk person [ttyname]
命令功能person : 预备对谈的使用者帐号,如果该使用者在其他机器上,则可输入
person@machine.namettyname : 如果使用者同时有两个以上的 tty 连线,可以自行选择合适的 tty 传讯息

系统设备相关

exit

内容
命令名称exit
命令格式exit [状态值]
命令功能执行exit可使shell以指定的状态值退出。若不设置状态值参数,则shell以预设值退出

kill

内容
命令名称kill
命令格式kill [-s <信息名称或编号>][程序]
命令功能-l <信息编号>  若不加<信息编号>选项,则-l参数会列出全部的信息名称
-s <信息名称或编号>  指定要送出的信息
[程序]  [程序]可以是程序的PID或是PGID,也可以是工作编号

ps

内容
命令名称ps
命令格式ps [options] [–help]
命令功能-A 列出所有的行程
-w 显示加宽可以显示较多的资讯
-au 显示较详细的资讯
使用率%MEM: 占用的记忆体使用率
VSZ: 占用的虚拟记忆体大小
RSS: 占用的记忆体大小
TTY: 终端的次要装置号码 (minor device number of tty)
STAT: 该行程的状态:D: 无法中断的休眠状态 (通常 IO 的进程)
R: 正在执行中
S: 静止状态
T: 暂停执行
Z: 不存在但暂时无法消除
W: 没有足够的记忆体分页可分配
<: 高优先序的行程
N: 低优先序的行程
L: 有记忆体分页分配并锁在记忆体内 (实时系统或捱A I/O)
START: 行程开始时间
TIME: 执行的时间
COMMAND:所执行的指令

clear

内容
命令名称clear
命令格式clear
命令功能Linux clear命令用于清除屏幕

bind

内容
函数名称bind
所需头文件#include <sys/socket.h>
函数原型int bind(int sockfd,struct sockaddr *my_addr,int addrlen)
函数功能保存在相应地址结构中的地址信息与套接字进行绑定
函数传入值sockfd: 套接字描述符
my_addr:绑定的地址
addrlen: 地址长度
函数返回值成功:0
出错:-1

shell脚本

在这里插入图片描述

shell脚本基础

什么是shell脚本?

shell脚本是将各类命令预先放入其中,方便一次性执行的一个程序文件,主要用以方便管理员进行设置或者管理

创建shell脚本

打开终端,创建shell脚本,然后就可开启愉快的shell脚本编程了

在这里插入图片描述
在这里插入图片描述

基础语法

开头

在进行正式的编写前,需要先写一个开头

#!/bin/bash

#!用来告诉系统它后面的参数是用来执行该文件的程序


内容

编写内容

在这里插入图片描述


注释

添加注释

在这里插入图片描述
然后添加权限给.sh文件

在这里插入图片描述


执行

现在就能执行这个shell脚本实现指定的功能了

不过执行有两种方式,自己选择

方案一
在这里插入图片描述

方案二
在这里插入图片描述


变量

在shell 脚本中使用变量时,需要先进行声明,不过这里将shell脚本的变量分为四种,在下文一一讲解,变量可以分为用户自定义变量位置参数预定义变量环境变量

变量

用户自定义变量

用户可以自己定义的变量,自定义变量的命名规则
1.首个字符必须为字母(az,AZ)或者下划线(
2.中间不能有空格,可以使用下划线(

3.不能使用其他标点符号

一般形式

变量名 = 值
num = 1

举个栗子

在这里插入图片描述

#!/bin/bash
s1="Hello World"
echo "s :" $s1

在这里插入图片描述

位置参数

由系统提供的参数称为位置参数,$0与键入的命令行一样,包含脚本文件名,$1-9分别包含第一个到第九个命令行参数

举个栗子

在这里插入图片描述

#!/bin/bash
echo $1 $2

在这里插入图片描述

预定义变量

预定义变量是在shell一开始时就定义了变量

$#:包含命令行参数的个数
$@:包含所有命令行参数
$?:包含前一个命令的退出状态,正常退出返回0,反之为非0值
$*:包含所有命令行参数
$$:包含正在执行进程的ID号

举个栗子

在这里插入图片描述

#!/bin/bash
echo "程序名为$0"
echo "一共输入了$#个参数"
echo "上一个程序的退出状态是$?"
echo "参数的所有内容:$*"
echo "包含正在执行进程的ID号$$a"

在这里插入图片描述

环境变量

所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行

常见的环境变量

环境变量名功能
HOME/etc/passwd文件中列出的用户主目录
IFS内部字段分隔符,默认为空格。tab及换行符
PATHshell搜索路径
PS1,PS2默认提示符及换行提示符
TERM终端类型,常用的有vt100、ansi、vt200、xterm
HISTSIZE保存历史命令记录的条数
LOGNAME当前用户登录名
HOSTNAME主机名称
SHELL当前用户用的是哪种shell
LANG/LANGUGE和语言相关的环境变量,使用多种语言的用户可以修改此环境变量
MAIL当前用户的邮件存放目录
TMOUT用来设置脚本过期的时间
UID已登录用户的ID
USER显示当前用户名
SECONDS记录脚本从开始到结束耗费的时间

设置环境变量的方法

命令名功能
echo显示指定环境变量
export设置新的环境变量
env显示所有环境变量
set显示所有本地定义的shell变量
unset清除环境变量

举个栗子
使用echo显示常用的环境变量
在这里插入图片描述

#!/bin/bash
echo "显示常用的环境变量"
echo "用户主目录:"$HOME
echo "shell的搜索路径:"$PATH
echo "终端类型:"$TERM
echo "保存历史命令记录的条数:"$HISTSIZE
echo "当前用户登录名:"$LOGNAME
echo "主机名称:"$HOSTNAME
echo "shell使用种类:"$SHELL
echo "登录用户ID:"$UID
echo "当前用户名字:"$USER

在这里插入图片描述

设置新环境变量(export)与删除环境变量(unset)
在这里插入图片描述

显示所有的环境变量
在这里插入图片描述

XDG_VTNR=7
SSH_AGENT_PID=2077
XDG_SESSION_ID=c2
CLUTTER_IM_MODULE=xim
SELINUX_INIT=YES
XDG_GREETER_DATA_DIR=/var/lib/lightdm-data/linux
SESSION=ubuntu
GPG_AGENT_INFO=/run/user/1000/keyring-D6T1Wt/gpg:0:1
SHELL=/bin/bash
VTE_VERSION=3409
TERM=xterm
XDG_MENU_PREFIX=gnome-
SSH_AGENT_LAUNCHER=upstart
WINDOWID=65011723
OLDPWD=/home/linux
UPSTART_SESSION=unix:abstract=/com/ubuntu/upstart-session/1000/1990
GNOME_KEYRING_CONTROL=/run/user/1000/keyring-D6T1Wt
GTK_MODULES=overlay-scrollbar:unity-gtk-module
USER=linux
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:
XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session0
XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0
SSH_AUTH_SOCK=/run/user/1000/keyring-D6T1Wt/ssh
SESSION_MANAGER=local/linux:@/tmp/.ICE-unix/2096,unix/linux:/tmp/.ICE-unix/2096
DEFAULTS_PATH=/usr/share/gconf/ubuntu.default.path
XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/usr/share/upstart/xdg:/etc/xdg
PATH=/home/linux/std/level10/gcc-4.6.4/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
DESKTOP_SESSION=ubuntu
QT_IM_MODULE=xim
QT_QPA_PLATFORMTHEME=appmenu-qt5
JOB=dbus
PWD=/home/linux/std/level2
XMODIFIERS=@im=fcitx
GNOME_KEYRING_PID=1988
LANG=en_US.UTF-8
GDM_LANG=en_US
MANDATORY_PATH=/usr/share/gconf/ubuntu.mandatory.path
UBUNTU_MENUPROXY=1
IM_CONFIG_PHASE=1
COMPIZ_CONFIG_PROFILE=ubuntu
GDMSESSION=ubuntu
SESSIONTYPE=gnome-session
SHLVL=1
XDG_SEAT=seat0
HOME=/home/linux
LANGUAGE=en_US
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
LOGNAME=linux
COMPIZ_BIN_PATH=/usr/bin/
QT4_IM_MODULE=fcitx
XDG_DATA_DIRS=/usr/share/ubuntu:/usr/share/gnome:/usr/local/share/:/usr/share/
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-SBlGq7HWVJ
LESSOPEN=| /usr/bin/lesspipe %s
INSTANCE=
TEXTDOMAIN=im-config
XDG_RUNTIME_DIR=/run/user/1000
DISPLAY=:0
XDG_CURRENT_DESKTOP=Unity
GTK_IM_MODULE=fcitx
LESSCLOSE=/usr/bin/lesspipe %s %s
TEXTDOMAINDIR=/usr/share/locale/
COLORTERM=gnome-terminal
XAUTHORITY=/home/linux/.Xauthority
_=/usr/bin/env


shell字符串

单引号

str='Hello'

双引号

str="World"

提取子字符串

str="Hello World"
echo ${str:6:10}

shell数组

定义数组

数组名=(12 ... 值n)

读取数组

${数组名[下标]}

shell程序

在这里插入图片描述

说明性语句

说明性语句即注释行,注释行可以出现在程序中的任何位置,既可以单独占用一行,也可以接在执行语句的后面

功能性语句

键盘读入变量值

在shell程序设计中,变量的值可以作为字符串从键盘读入

read 变量

举个栗子

在这里插入图片描述

#!/bin/bash
echo "请输入今天的日期:"
read year month day
echo "今天是 $year-$month-$day"

在这里插入图片描述


算术运算指令

算术运算命令expr主要用于进行简单的整数运算,包括加减乘除

举个栗子

在这里插入图片描述

#!/bin/bash
echo "请输入两个数字"

read a
read b

add=`expr $a + $b`
sub=`expr $a - $b`
mul=`expr $a \* $b`
div=`expr $a / $b`

echo "add = "$add
echo "sub = "$sub
echo "mul = "$mul
echo "div = "$div

在这里插入图片描述


test命令

test命令测试命令,可以用来测试字符串、整数和文件属性

1.字符串测试

公式功能
s1 = s2测试两个字符串的内容是否完全一样,一样输出0,不一样输出1
s1 != s2测试两个字符串的内容是否有差异,不一样输出0,一样输出1
-z s1测试s1字符串的长度是否为0,不为0输出0,为0输出1
-n s1测试s1字符串的长度是否不为0,为0输出0,不为0输出1

举个栗子

注意[后面、 ]前面和 =两边都必须要有一个空格

在这里插入图片描述

#!/bin/bash
read a
read b
[ "$a" = "$b" ]
echo $?
[ "$a" != "$b" ]
echo $?
[ -n "$a" ]
echo $?
[ -z "$b" ]
echo $?

在这里插入图片描述


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

举个栗子

在这里插入图片描述

#!/bin/bash
echo "请输入两个数字,比较他们是否相等"
read a1
read a2
if test $a1 -eq $a2
	then
		echo "$a1 = $a2"
	else
		echo "$a1 != $a2"
fi

在这里插入图片描述


3.文件测试

公式功能
-d name测试name是否为一个目录
-f name测试name是否为普通文件
-L name测试name是否为符号链接
-r name测试name文件是否存在且为可读
-w name测试name文件是否存在且为可写
-x name测试name文件是否存在且为可执行
-s name测试name文件是否存在且其长度不为0
f1 -nt f2测试文件f1是否比文件f2更新
f1 -ot f2测试文件f1是否比文件f2更旧

举个栗子

结构性语句

条件测试语句

if  表达式
    then    命令表
fi
if  表达式
    then    命令表1
    else    命令表2
fi

这个在上面的栗子中已经讲到了,这里就不举例了


多路分支语句

case 字符串变量  in
        模式1)    
                    命令表1
                    ;;
        模式2)    
                    命令表2
                    ;;
       ...           
       模式3)    
                    命令表3
                    ;;
esac           

举个栗子

进入游戏前,你需要选择角色,这里有小鱼、大鱼、鲨鱼和鲸鱼可供选择,分别用数字1~4来表示

在这里插入图片描述

#!/bin/bash

case $1 in
	1)
		echo "你选择了小鱼"
		;;
	2)
		echo "你选择了大鱼"
		;;
	3)
		echo "你选择了鲨鱼"
		;;
	4)
		echo "你选择了鲸鱼"
		;;
esac

在这里插入图片描述


循环语句for

for     变量名     in      单词表
do
        命令表
done

循环语句while

while 命令或表达式
do
        命令表
done

break和continue

break n   

表示跳出n层

continue

表示跳出一层循环

shell函数

shell程序中,常常把完成固定功能,且多次使用的一组命令封装在一个函数里,每当要使用时只需调用该函数即可

函数定义

定义函数有两种方式

方法一

function_name()
{
    command1
    ...
    commandn
}

方法二

function function_name()
{
    command1
    ...
    commandn
}

函数调用

对于shell脚本的函数调用也有两种方法

方法一

直接将返回值传递给主程序里的变量

name=`function_name [arg1 arg2]`

方法二

通过下一句的$?输出上一句的返回值

function_name [arg1 arg2]
echo $?

函数返回状态

上文中已经提到了这个函数返回状态的获取方式,是通过$?来获取的

脚本调用

在shell脚本的执行过程中,支持调用另一个shell脚本

调用的一般格式

./a.sh

更多内容

Linux-开发与管理 P1 shell编程

Linux-开发与管理 P2 GCC编译器

Linux-开发与管理 P3 GDB调试器

Linux-开发与管理 P4 Makefile基础

Linux-开发与管理 P5 软件管理

Linux-开发与管理 P6用户管理

Linux-开发与管理 P7 文件系统

  • 1
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值