文章目录

  • 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 和语言相关的环境变量,使用多种语言的用户可以修改此环境变量
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数组

定义数组

数组名=(值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编程相关推荐

  1. Linux开发工具实现C/C++编程

    Linux开发工具实现C/C++编程 文章目录 Linux开发工具实现C/C++编程 1.软件包管理器:yum 如何安装软件 如何卸载软件 2.编辑器:vim 1.常见的三种模式: 2.正常模式下的快 ...

  2. 【Linux】Linux学习(四)Shell编程

    Linux学习(四)Shell编程 Shell概述 Shell脚本入门 变量 系统预定义变量 自定义变量 特殊变量 运算符 条件判断 流程控制(重点) if判断 case语句 for循环 while循 ...

  3. Linux学习笔记 -- rpm 与 shell 编程

    目录 rpm 与 YUM rpm 包的管理 rmp 包 查询 安装 卸载 yum 安装 JDK mysql 8.0 离线安装 Centos 7 忘记mysql的root密码 Shell 编程 shel ...

  4. python运维脚本面试_运维开发工程师 面试题 shell编程

    1. 32位随机密码生成 cat /proc/sys/kernel/random/uuid | tr -d '-' 2.查看当前系统每个ip的tcp连接数 -n 强制显示IP地址 -t 显示TCP连接 ...

  5. Linux高级专题详解--shell编程大全(shell变量,if语句,case语句,for循环,while循环,函数调用,数组,正则表达式,shell脚本三剑客--grep,sed,awk家族)

    shell编程 初始shell 程序 语言 编程 ---------------------------------- 语言 自然语言:汉语.英语 计算机语言:c语言.c++.(java php py ...

  6. linux 程序实验总结,Linux实验报告(实验四) shell编程实验

    实验四 shell编程实验(二) 班级:姓名:学号:上机时间:年月日 任课教师:实验教师:实验成绩: 一.实验目的 综合Linux常用命令和vi编辑器的使用,熟练掌握shell脚本编程. 二.实验注意 ...

  7. Linux系统应用 第八章 Shell编程入门

    8.1Shell编程过程 在Linux中,Shell不但能与用户进行逐个命令交互执行,也可以通过脚本语言进行编程.通过对Shell进行编程,可使大量任务自动化,对于系统管理.系统维护方面特别有用. 复 ...

  8. Linux后端开发-POSIX标准以及shell编程

    POSIX标准 就是定义了类Unix系统提供接口(系统API(应用程序和库之间的编程接口),shell命令)的标准,便于代码的移植. 除了API还有ABI 应用程序二进制接口 他是让一个可执行的文件可 ...

  9. linux基础(6)-shell编程

    shell脚本 shell脚本程序:以文件形式存放批量的linux命令集合,该文件能够被shell释放执行.通常由一段linux命令.shell命令.控制语句以及注释语句构成. shell脚本特点: ...

最新文章

  1. 【小白学PyTorch】12.SENet详解及PyTorch实现
  2. 9月4日服务器例行维护公告,《诺亚传说手游》官网-【例行维护】9月4日官方维护公告(抢鲜服)- 诺亚手游-首款科幻团战手游...
  3. SAP Spartacus里unit list tree节点collapse all按钮的实现逻辑
  4. 设置安全性根据Folder关联的条目模板设置上传文档安全性
  5. elasticsearch scroll 一页最大数据量_elasticsearch 百亿级数据检索案例与原理
  6. Delphi 打印杨辉三角
  7. Object-C日志记录
  8. 嵌入式Linux/Android疑难杂症工作笔记
  9. 立体几何——球缺问题
  10. java 资格证_程序员从业资格证
  11. 联发科5G基带处理器MT6297(Helio M70)
  12. 推荐一本好书《 Java程序员 上班那点事儿》
  13. 基于JavaScript实现的网页版贪吃蛇
  14. CSDN博客个人账号注册与登录
  15. 谷歌浏览器怎么将迅雷设置为默认下载方式 谷歌浏览器设置迅雷为默认下载的教程
  16. 重启更新电脑进不去Ubuntu输入密码正确反复回到登陆界面
  17. Python 字典的get()用法
  18. 一步步搭建Retrofit+RxJava+MVP网络请求框架(二),个人认为这次封装比较强大了
  19. 死锁的产生条件及解决办法
  20. Spring Cloud Gateway 基本配置

热门文章

  1. 太原市高二会考计算机试题及答案,太原市第二十一中学校2019-2020学年高二会考模拟生物试卷...
  2. 财政部关于印发《政府采购评审专家管理办法》的通知
  3. 企业信用等级AAA认证 山东企业信用3A认证办理费用周期
  4. 网易运营微专业_数据驱动运营
  5. 小米十年,做不好售后
  6. 还是畅通工程 C语言
  7. 蓝桥杯单片机比赛学习:3、独立按键与矩阵按键的基本原理
  8. 列表、下标、切片及练习
  9. JS报错-TypeError: xxx is not a function
  10. Field testMapper in com.example.demo.service.TestService required a bean of type ‘com.example.demo.m