Linux-开发与管理 P1 shell编程
文章目录
- Linux-开发与管理 P1 shell编程
- shell基础
- shell简介
- shell历史
- 命令格式
- linux命令
- 文件文档相关
- 文件管理
- 文档编辑
- 文件传输
- 磁盘相关
- 网络通讯
- 系统设备相关
- shell脚本
- shell脚本基础
- 基础语法
- 变量
- shell程序
- 说明性语句
- 功能性语句
- 结构性语句
- shell函数
- 脚本调用
- 更多内容
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及换行符 |
PATH | shell搜索路径 |
PS1,PS2 | 默认提示符及换行提示符 |
TERM | 终端类型,常用的有vt100、ansi、vt200、xterm |
HISTSIZE | 保存历史命令记录的条数 |
LOGNAME | 当前用户登录名 |
HOSTNAME | 主机名称 |
SHELL | 当前用户用的是哪种shell |
LANG/LANGUGE | 和语言相关的环境变量,使用多种语言的用户可以修改此环境变量 |
当前用户的邮件存放目录 | |
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数组
定义数组
数组名=(值1 值2 ... 值n)
读取数组
${数组名[下标]}
shell程序
说明性语句
说明性语句即注释行,注释行可以出现在程序中的任何位置,既可以单独占用一行,也可以接在执行语句的后面
功能性语句
键盘读入变量值
在shell程序设计中,变量的值可以作为字符串从键盘读入
read 变量
举个栗子
#!/bin/bash
echo "请输入今天的日期:"
read year month day
echo "今天是 $year-$month-$day"
算术运算指令
算术运算命令expr主要用于进行简单的整数运算,包括加减乘除
举个栗子
#!/bin/bash
echo "请输入两个数字"read a
read badd=`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 $a2thenecho "$a1 = $a2"elseecho "$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 命令表1else 命令表2
fi
这个在上面的栗子中已经讲到了,这里就不举例了
多路分支语句
case 字符串变量 in模式1) 命令表1;;模式2) 命令表2;;... 模式3) 命令表3;;
esac
举个栗子
进入游戏前,你需要选择角色,这里有小鱼、大鱼、鲨鱼和鲸鱼可供选择,分别用数字1~4来表示
#!/bin/bashcase $1 in1)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 文件系统
Linux-开发与管理 P1 shell编程相关推荐
- Linux开发工具实现C/C++编程
Linux开发工具实现C/C++编程 文章目录 Linux开发工具实现C/C++编程 1.软件包管理器:yum 如何安装软件 如何卸载软件 2.编辑器:vim 1.常见的三种模式: 2.正常模式下的快 ...
- 【Linux】Linux学习(四)Shell编程
Linux学习(四)Shell编程 Shell概述 Shell脚本入门 变量 系统预定义变量 自定义变量 特殊变量 运算符 条件判断 流程控制(重点) if判断 case语句 for循环 while循 ...
- Linux学习笔记 -- rpm 与 shell 编程
目录 rpm 与 YUM rpm 包的管理 rmp 包 查询 安装 卸载 yum 安装 JDK mysql 8.0 离线安装 Centos 7 忘记mysql的root密码 Shell 编程 shel ...
- python运维脚本面试_运维开发工程师 面试题 shell编程
1. 32位随机密码生成 cat /proc/sys/kernel/random/uuid | tr -d '-' 2.查看当前系统每个ip的tcp连接数 -n 强制显示IP地址 -t 显示TCP连接 ...
- Linux高级专题详解--shell编程大全(shell变量,if语句,case语句,for循环,while循环,函数调用,数组,正则表达式,shell脚本三剑客--grep,sed,awk家族)
shell编程 初始shell 程序 语言 编程 ---------------------------------- 语言 自然语言:汉语.英语 计算机语言:c语言.c++.(java php py ...
- linux 程序实验总结,Linux实验报告(实验四) shell编程实验
实验四 shell编程实验(二) 班级:姓名:学号:上机时间:年月日 任课教师:实验教师:实验成绩: 一.实验目的 综合Linux常用命令和vi编辑器的使用,熟练掌握shell脚本编程. 二.实验注意 ...
- Linux系统应用 第八章 Shell编程入门
8.1Shell编程过程 在Linux中,Shell不但能与用户进行逐个命令交互执行,也可以通过脚本语言进行编程.通过对Shell进行编程,可使大量任务自动化,对于系统管理.系统维护方面特别有用. 复 ...
- Linux后端开发-POSIX标准以及shell编程
POSIX标准 就是定义了类Unix系统提供接口(系统API(应用程序和库之间的编程接口),shell命令)的标准,便于代码的移植. 除了API还有ABI 应用程序二进制接口 他是让一个可执行的文件可 ...
- linux基础(6)-shell编程
shell脚本 shell脚本程序:以文件形式存放批量的linux命令集合,该文件能够被shell释放执行.通常由一段linux命令.shell命令.控制语句以及注释语句构成. shell脚本特点: ...
最新文章
- 【小白学PyTorch】12.SENet详解及PyTorch实现
- 9月4日服务器例行维护公告,《诺亚传说手游》官网-【例行维护】9月4日官方维护公告(抢鲜服)- 诺亚手游-首款科幻团战手游...
- SAP Spartacus里unit list tree节点collapse all按钮的实现逻辑
- 设置安全性根据Folder关联的条目模板设置上传文档安全性
- elasticsearch scroll 一页最大数据量_elasticsearch 百亿级数据检索案例与原理
- Delphi 打印杨辉三角
- Object-C日志记录
- 嵌入式Linux/Android疑难杂症工作笔记
- 立体几何——球缺问题
- java 资格证_程序员从业资格证
- 联发科5G基带处理器MT6297(Helio M70)
- 推荐一本好书《 Java程序员 上班那点事儿》
- 基于JavaScript实现的网页版贪吃蛇
- CSDN博客个人账号注册与登录
- 谷歌浏览器怎么将迅雷设置为默认下载方式 谷歌浏览器设置迅雷为默认下载的教程
- 重启更新电脑进不去Ubuntu输入密码正确反复回到登陆界面
- Python 字典的get()用法
- 一步步搭建Retrofit+RxJava+MVP网络请求框架(二),个人认为这次封装比较强大了
- 死锁的产生条件及解决办法
- Spring Cloud Gateway 基本配置
热门文章
- 太原市高二会考计算机试题及答案,太原市第二十一中学校2019-2020学年高二会考模拟生物试卷...
- 财政部关于印发《政府采购评审专家管理办法》的通知
- 企业信用等级AAA认证 山东企业信用3A认证办理费用周期
- 网易运营微专业_数据驱动运营
- 小米十年,做不好售后
- 还是畅通工程 C语言
- 蓝桥杯单片机比赛学习:3、独立按键与矩阵按键的基本原理
- 列表、下标、切片及练习
- JS报错-TypeError: xxx is not a function
- Field testMapper in com.example.demo.service.TestService required a bean of type ‘com.example.demo.m