2)、要节制根本Linux 命令,文本的 增编削查、环境变量的配置利用。
3)、节制Linux正则表达式及三剑客: grep sed awk的基本利用
4)、熟习常见的 Linux 网络做事的支配、优化、日志剖析及排错

学习shell 脚本的目的在于对公事情中系统及做事等进行自动化的管理,因此如果不熟习事情中的网络做事,就会很难利用shell 编程处理这些做事;不节制网络做事等知识,就会让Shell开拓者的能力打折扣,乃至只是节制了 shell 编程的基本语法,并不能真正的学好shell编程。
什么是 ShellShell 是一个命令阐明器,它的浸染是阐明实行用户输入的命令及程序等,用户没输入一条命令,Shell 阐明器就会实行一天命令,从键盘输入的命令,就会立即得到实行结果的对话办法,我们称之为 交互式shell。
Shell 存在于系统之上用户之下,介于用户系统之间,用来卖力于用户和系统直接对话。
什么是 Shell 脚本利用shell命令编写的文件可实行,我们称之为脚本。脚本一样平常是一个可实行文件。
脚本措辞的种类Bourne Shell(/usr/bin/sh或/bin/sh)Bourne Again Shell(/bin/bash)C Shell(/usr/bin/csh)K Shell(/usr/bin/ksh)Shell for Root(/sbin/sh把稳:查看当前系统支持的shell类型
[root@localhost ~]# cat /etc/shells/bin/sh/bin/bash/usr/bin/sh/usr/bin/bash
其他类型的措辞
Php:网页程序措辞,动态脚本措辞。
Perl:perl脚本措辞功能比shell脚本措辞强大的多,2010年以前非常盛行,目前已在淘汰的边缘。
Python:Python脚本措辞近几年非常火的措辞,人工智能,web 开拓,数据剖析,运维脚本开拓等都非常好用,入门门槛低
Shell 脚本措辞的有点Shell 脚本措辞的上风在于处理偏操作系统底层的业务,如Linux系统内部的很多运用都是利用shell脚本措辞开拓的,对付一下常规业务操作,利用shell更符合Linux运维 大略、易用、高效的三大原则。
操作系统默认shellCentos RedHat rockylinux 默认利用shell都是Bourne Again shell(bash)
通过以下两种方法查看系统默认shell类型:
[root@ym ~]# echo $SHELL/bin/bash
[root@ym ~]# grep ^root /etc/passwdroot:x:0:0:root:/root:/bin/bash
Shell 脚本的创建与实行打开一个别系脚本文件,我们可以查看脚本的格式脚本的命名:脚本的拓展名.sh结尾系统加载shell初始化文件:
/etc/profile # 系统初始化shell环境配置文件/etc/profile.d/ # 目录存放系统初始化加载的sh脚本文件~/.bash_profile # 环境变量设置文件~/.bashrc # 当前登任命户的环境变量配置文件(可能不存在)
Shell脚本实行:
shell脚本的实行过程
常日情形下,在实行shell脚本是,会向系统内核要求启动一个新的进程,在该进程中实行脚本命令及子进程脚本
shell 脚本常日采取一下集中办法实行 实例: bash test.sh 或 sh test.sh ./test.sh 这种办法须要test.sh有可实行权限 source test.sh 或 . test.sh 这种办法一样平常是读入脚本内容
shell脚本的第一行是指定脚本阐明器,常日为: #!/bin/bash 或 #!/bin/sh代码规范实例:1、#! /bin/bash # : 代表注释 #!
什么是Shell变量1)、什么是变量
代表特例 /bin/bash 命令阐明器的绝对路径2、 须要描述脚本的功能、作者、韶光、用法、版本的信息# Name:脚本的名字# Desc:功能描述 Describe# Path:存放路径# Usage:脚本的利用方法# Update:更新韶光# Author: 作者# Relase:版本
大略来说变量便是用一个固定的字符串代替更多的的内容,变量是一个可变革的量一个不固定的量
2)、变量的命名规则变量名的命名须遵照如下规则:
命名只能利用英笔墨母,数字和下划线,首个字符不能以数字开头。中间不能有空格,可以利用下划线(_)。不能利用标点符号。不能利用bash里的关键字(可用help命令查看保留关键字)。3)、变量的类型运行shell时,会同时存在三种变量:
局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序须要环境变量来担保其正常运行。必要的时候shell脚本也可以定义环境变量。shell变量 shell变量是由shell程序设置的分外变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量担保了shell的正常运行4)、变量的浸染域(浸染范围)局部变量只针对付当前shell 生效全局变量只针对付全体操作系统生效5)、查看系统的环境变量set 输出所有变量,包括全局变量、局部变量env 只显示全局变量declare 输出所有变量,犹如 setexport 只显示和设置环境变量系统中已经存在一些环境变量如:HOME PATH SHELL UID USER MAIL 等,在用户登录之前就已经备/bin/longin 程序设置好。6)、自定义环境变量首先按照变量的命名规则利用指定字符,写在等号的左边作为变量的名称(标记),在写一个字符作为值赋值给变量名。
[root@ym ~]# ym_123=hello # 定义一个变量名称叫 ym_123[root@ym ~]# echo $ym_123 # 利用echo 输出变量所对应的值hello
单引号:调用变量事不管里面有什么都要原样输出,但引号的内容;双引号:调用变量时可以调用变量所赋的值,显示变量的内容呢;反引号:可以调用命令并把命令所输出的结果复制给变量;无引号:可以复制一个连续的字母或数字给变量,中间不能有空格;export variname=valuedeclare [-aixr] variable 参数: -a :将后面名为 variable 的变量定义成为数组 (array) 类型 -i :将后面名为 variable 的变量定义成为整数数字 (integer) 类型 -x :用法与 export 一样,便是将后面的 variable 变成环境变量; -r :将变量设定成为 readonly 类型,该变量不可被变动内容,也不能 unset7)、环境变量的配置用户环境变量配置 .bashrc .bash_profile全局环境变量配置 /etc/profile /etc/bashrc /etc/profile.d/
[root@ym ~]# echo $PATH # 查看当前系统的环境变量/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin[root@ym ~]# export PATH=$PATH:/usr/local/bin # 添加路径到系统的环境变量中(临时设置系统环境变量,重启操作系统丢失,须要写在配置文件中)
Shell 中分外的变量
变量
描述
$0
当前脚本的文件名
$n
通报给脚本或函数的参数
$#
通报给脚本或函数的参数个数
$
通报给脚本或函数的所有参数
$@
通报给脚本或函数的所有参数。被双引号(" ")包含时,与 $ 稍有不同,下面将会讲到。
$?
上个命令的退出状态,或函数的返回值
$$
当前Shell进程ID。对付 Shell 脚本,便是这些脚本所在的进程ID
set -- " I an hostname"echo $# # 参数个数#测试 $ $@ 不带引号[root@localhost ~]# echo $2handsone[root@localhost ~]# echo $i am handsone tdlinux[root@localhost ~]# echo $@i am handsone tdlinux[root@localhost ~]# for i in $;do echo $i;doneiamhandsonetdlinux[root@localhost ~]# for i in $@;do echo $i;doneiamhandsonetdlinux#测试 $ $@ 带双引号[root@localhost ~]# for i in "$";do echo $i;donei am handsone tdlinux#"$@":把变量分割成:$1,$2,$3[root@localhost ~]# for i in "$@";do echo $i;donei amhandsonetdlinux
实例:$_ 和 himBH
$- 记录的是当前配置打开的shell选项, 而 himBH 是默认值
himBH 每个字母代表着一个shell选项,详细如下:
h - hashall # bash 的 hash 功能,可以实现让某些 command 和 详细路径 绑定在一起。i - interactive-comments# 配置在交互 shell 模式下,是否许可注释。m - monitor # 配置是否打开掌握 Job control 功能。B - braceexpand # 关于括号利用的flag,打开后可以快捷地实现某些效果H- history #是否允許用 “感叹号 !
+ history number ” 来实行历史命令
可以通过 set -o 查看来确认打开状态
hash 哈希命令参数:-l 显示哈希表示所有的项目
-r 打消哈希表所有项
-d <名称> 删除哈希表个中的一项
-p <路径> 向哈希表中增加一项内容,添加后就可以利用了
-t <命令> 显示hash表中命令的完全路径,如果没有就会报not found缺点
实例:hash
[root@ym ~]# bash # 进入一个全新的 shell[root@ym ~]# hashhash: hash table empty # 由于是新建 shell,以是hash表为空,符合预期[root@ym ~]# ls -l[root@ym ~]# hashhits command 1 /usr/bin/ls[root@ym ~]# top[root@ym ~]# hashhits command 1 /usr/bin/ls 1 /usr/bin/top[root@ym ~]# uptime 17:56:40 up 1138 days, 7 min, 1 user, load average: 0.47, 0.36, 0.28[root@ym ~]# hash # 可以看到hash表在不断更新hits command 1 /usr/bin/uptime 1 /usr/bin/ls 1 /usr/bin/top[root@ym ~]# hash -lbuiltin hash -p /usr/bin/uptime uptimebuiltin hash -p /usr/bin/ls lsbuiltin hash -p /usr/bin/top top[root@ym ~]# hash -p /tmp/mydate date # 手动添加hash表[root@ym ~]# hash -lbuiltin hash -p /usr/bin/uptime uptimebuiltin hash -p /tmp/mydate date # 添加成功builtin hash -p /usr/bin/ls lsbuiltin hash -p /usr/bin/top top[root@ym ~]# datebash: /tmp/mydate: No such file or directory # 由于手动添加的hash表指向实行文件不存在,以是报错,这解释新增的hash表确实在work[root@ym ~]# hash -d date # 手动清楚刚加的hash表,利用 -r 则全部打消[root@ym ~]# hash -lbuiltin hash -p /usr/bin/uptime uptimebuiltin hash -p /usr/bin/ls lsbuiltin hash -p /usr/bin/top top[root@ym ~]# date # 规复Sun Jan 19 18:02:45 CST 2022
i 可以在交互shell 中利用 # 号注释m 任务掌握:
Ctrl + z 后台运行
fg 命令将后台任务规复到前台
B 可以利用 {} 来实行命令history 历史命令:!! : 返回并实行最近的一个历史命令 !n : 返回并实行第 n 个历史命令
8)、bash shell 内置变量命令bash shell 包含一些内置命令。常用的内部命令有:echo、eval、exec、export、read、shift。下面先容一些详细的用法
8.1)、echo args 可以利用字符和变量的组合
echo 常用的参数列表
参数
解释
-n
不换行输出
-e
阐明转移字符
\n
换行输出
\r
回车
\t
制表符
\b
退格删除前一个字符
\v
纵向制表符
-E
不解析转义字符
\a
发出警告的凤鸣声
8.2)、eval args:当shell 程序实行到eval语句时,shell 读入参数args,并将它们组合成新的可实行命令
[root@ym test]# cat test.sh#!/bin/shecho $0echo \$$#eval "echo \$$#"[root@ym test]# sh test.sh a b ctest.sh$3c
8.3)、exec cmd : exec 命令能够在不创建子shell进程的条件下,在当前shell中实行命令。
#!/bin/shseq 1 5 > /tmp/test.logexec < /tmp/test.logcat /tmp/test.logwhile read linedo echo $linedoneecho "ok"# 实行结果[root@ym test]# sh 1test.sh12345ok# 实例2:[root@ym test]# cat 2test.sh#!/bin/shwhile read linedo echo "##########打印标准输入的内容##########" echo "输出读到的一行内容:$line" echo "##########重新开始读取标准输入内容####" sleep 1done[root@ym test]# sh 2test.shhello shell##########打印标准输入的内容##########输出读到的一行内容:hello shell##########重新开始读取标准输入内容####hello world##########打印标准输入的内容##########输出读到的一行内容:hello world##########重新开始读取标准输入内容####hello python##########打印标准输入的内容##########输出读到的一行内容:hello python##########重新开始读取标准输入内容####
8.4)、read :从标准输入读取字符信息,传给shell程序内部定义的变量
[root@ym ~]# read -p "Plase input your name:" namePlase input your name:root[root@ym ~]# echo $nameroot
8.5)、shift :shift语句会改变位置参数,即 $1 $2 $3 会变成 $2 $3, 重新排序参数位置。
[root@ym test]# cat test.sh#!/bin/shecho $# # 获取传入的参数个数shift echo $ # 输出传输的所有参数# 实行结果[root@ym test]# sh test.sh -c python2python
8.6)、exit :退出shell程序,可以在 exit 后面指定一个数字作为状态码 1 - 255 范围
#! /bin/bashif [ $# -ne 1 ] #如果传入参数个数即是1,则正常退出;否则非正常退出。thenecho "args no!"exit 123elseecho "args ok!"exit 0fi[root@ym ~]# sh test.shargs no![root@ym ~]# echo $?123
shell ( ) (( )) [ ] [[ ]] 用法小括号()命令组。括号中的命令将会新开一个子shell顺序实行,以是括号中的变量不能够被脚本余下的部分利用。括号中多个命令之间用分号隔开,末了一个命令可以没有分号,各命令和括号之间不必有空格。命令更换。等同于cmd,shell扫描一遍命令行,创造了$(cmd)构造,便将$(cmd)中的cmd实行一次,得到其标准输出,再将此输出放到原来命令。用于初始化数组。如∶array=(a b c d)双小括号 (())整数扩展。这种扩展打算是整数型的打算,不支持浮点型。只要括号中的运算符、表达式符合C措辞运算规则.都可用在$((exp))中,乃至是三目运算符。纯挚用(())也可重定义变量值,比如 a=5;((a++)) 可将 $a 重定义为6常用于算术运算比较,双括号中的变量可以不该用$符号前缀。括号内支持多个表达式用逗号分开。for((i=0;i<5;i++))单中括号 [ ] 、 双中括号 [[ ]]test <条件表达式> 等价于 [ <条件表达式> ] 语法构造[[ ]] 是拓展的 test 条件测试,可以利用 通配符等进行模式匹配,这是差异于其他几种的语法格式&&、||、>、< 等操作符可以利用与 双中括号[[ ]],不能用于单中括号[ ],在 [ ] 中一样平常利用 -a -o -gt lt更换运算符
变量
描述
${var:-word}
如果var存在且非null,返回它的值;否则返回word
${var:=word}
如果var存在且非null,返回它的值;否则将word赋值给var,并返回var的值
${var:?word}
如果var存在且非null,返回它的值;否则显示var:?word
${var:+word}
如果var存在且非null,返回word;否则返回null
模式匹配模式
描述
${variable#pattern}
如果模式匹配于变量的开头处,则删除匹配的最短部分,并返回剩下的部分
${variable##pattern}
如果模式匹配于变量的开头处,则删除匹配的最长部分,并返回剩下的部分
${variable%pattern}
如果模式匹配于变量的结尾处,则删除匹配的最短部分,并返回剩下的部分
${variable%%pattern}
如果模式匹配于变量的结尾处,则删除匹配的最长部分,并返回剩下的部分
把稳:模式匹配处理字符串截取操作
这四种模式中都不会改变 variable 的值,个中,只有在 pattern 中利用了 匹配符号时,%和%%,# 和 ## 才有差异构造中的 pattern 支持通配符如下::表示零个或多个任意字符?:表示仅与一个任意字符匹配[...]:表示匹配中括号里面的字符[!...]: 表示不匹配中括号里面的字符实例:${variable#pattern}
[root@ym ~]# var="/usr/share/doc/mysql-common/COPYING.Google"[root@ym ~]# echo ${var#/n/}COPYING.Google
实例:${variable##pattern}
[root@ym ~]# var="/usr/share/doc/mysql-common/COPYING.Google"[root@ym ~]# echo $var/usr/share/doc/mysql-common/COPYING.Google[root@ym ~]# echo ${var##//}COPYING.Google
实例:${variable%pattern}
[root@ym ~]# var="/usr/share/doc/mysql-common/COPYING.Google"[root@ym ~]# echo ${var%/sh}/usr
实例:${variable%%pattern}
[root@ym ~]# var="/usr/share/doc/mysql-common/COPYING.Google"[root@ym ~]# echo ${var%%s}/u
字符串操作:
[root@ym ~]# echo ${var%se} 从最右边删除最短匹配testca[root@ym ~]# echo $vartestcase[root@ym ~]# echo ${var%%se} 从最右边删除最长匹配te[root@ym ~]# echo $var 变量没有改变testcase[root@ym ~]# echo ${var#?e} 从最左边删除最短匹配stcase[root@ym ~]# echo $vartestcase[root@ym ~]# echo ${var#e} 从最左边删除最短匹配stcase[root@ym ~]# echo $vartestcase[root@ym ~]# echo ${var##e} 从最左边删除最长匹配,即删除所有[root@ym ~]# echo $vartestcase[root@ym ~]# echo ${var##s} 从最左边删除最长匹配e[root@ym ~]# echo $vartestcase[root@ym ~]# echo ${var#test} 删除testcase[root@ym ~]# echo $vartestcase[root@ym ~]# echo ${var#tests} 没有匹配testcase
Shell 基本运算符算术运算符
下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:
算数
解释
实例
+
加法
expr $a + $b 结果为 30。
-
减法
expr $a - $b 结果为 -10。
乘法
expr $a \ $b 结果为 200。
/
除法
expr $b / $a 结果为 2。
%
取余
expr $b % $a 结果为 0。
=
赋值
a=$b 将把变量 b 的值赋给 a。
==
相等。用于比较两个数字,相同则返回 true。
[ $a == $b ] 返回 false。
!=
不相等。用于比较两个数字,不相同则返回 true。
[ $a != $b ] 返回 true。
关系运算符关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:
运算符
解释
实例
-eq
检测两个数是否相等,相等返回 true。
[ $a -eq $b ] 返回 false。
-ne
检测两个数是否不相等,不相等返回 true。
[ $a -ne $b ] 返回 true。
-gt
检测左边的数是否大于右边的,如果是,则返回 true。
[ $a -gt $b ] 返回 false。
-lt
检测左边的数是否小于右边的,如果是,则返回 true。
[ $a -lt $b ] 返回 true。
-ge
检测左边的数是否大于即是右边的,如果是,则返回 true。
[ $a -ge $b ]返回 false。
-le
检测左边的数是否小于即是右边的,如果是,则返回 true。
[ $a -le $b ] 返回 true。
布尔运算符下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:
运算符
解释
实例
!
非运算,表达式为 true 则返回 false,否则返回 true。
[ ! false ] 返回 true。
-o
或运算,有一个表达式为 true 则返回 true。
[ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a
与运算,两个表达式都为 true 才返回 true。
[ $a -lt 20 -a $b -gt 100 ] 返回 false。
逻辑运算符以下先容 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:
运算符
解释
实例
&&
逻辑的 AND
[[ $a -lt 100 && $b -gt 100 ]] 返回 false
||
逻辑的 OR
[[ $a -lt 100 || $b -gt 100 ]] 返回 true
字符串运算符下表列出了常用的字符串运算符,假定变量 a 为 “abc”,变量 b 为 “efg”:
运算符
解释
实例
=
检测两个字符串是否相等,相等返回 true。
[ $a = $b ] 返回 false。
!=
检测两个字符串是否相等,不相等返回 true。
[ $a != $b ] 返回 true。
-z
检测字符串长度是否为0,为0返回 true。
[ -z $a ] 返回 false。
-n
检测字符串长度是否为0,不为0返回 true。
[ -n "$a" ] 返回 true。
$
检测字符串是否为空,不为空返回 true。
[ $a ] 返回 true。
文件测试运算符文件测试运算符用于检测 Unix 文件的各种属性。
属性检测描述如下:
操作符
解释
实例
-b file
检测文件是否是块设备文件,如果是,则返回 true。
[ -b $file ] 返回 false。
-c file
检测文件是否是字符设备文件,如果是,则返回 true。
[ -c $file ] 返回 false。
-d file
检测文件是否是目录,如果是,则返回 true。
[ -d $file ] 返回 false。
-f file
检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。
[ -f $file ] 返回 true。
-g file
检测文件是否设置了 SGID 位,如果是,则返回 true。
[ -g $file ] 返回 false。
-k file
检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。
[ -k $file ] 返回 false。
-p file
检测文件是否是有名管道,如果是,则返回 true。
[ -p $file ] 返回 false。
-u file
检测文件是否设置了 SUID 位,如果是,则返回 true。
[ -u $file ] 返回 false。
-r file
检测文件是否可读,如果是,则返回 true。
[ -r $file ] 返回 true。
-w file
检测文件是否可写,如果是,则返回 true。
[ -w $file ] 返回 true。
-x file
检测文件是否可实行,如果是,则返回 true。
[ -x $file ] 返回 true。
-s file
检测文件是否为空(文件大小是否大于0),不为空返回 true。
[ -s $file ] 返回 true。
-e file
检测文件(包括目录)是否存在,如果是,则返回 true。
[ -e $file ] 返回 true。
-L file
检测文件是否存在且是一个 链接文件,如果是,则返回true。
[ -L $file ] 返回 true。
-S file
检测文件是否存在且是一个socket文件,如果是,则返回true。
[ -S $file ] 返回 true。
file1 -nt file2
检测file1 是否比file2新,如果是,则返回true
[ file1 -nt file2 ]返回 true。
file1 -ot file2
检测file1 是否比file2 旧,如果是,则返回true
[ file1 -nt file2 ]返回 true。
file1 -ef file 2
检测file1 是否和file2 是同一个文件,如果是,则返回true
[ file1 -nt file2 ]返回 true。
Shell 流掌握if else语句1)、单分支条件判断#第一种语法:if <条件表达式>thencommand 指令fi#第二种语法:if <条件表达式>;thencommand 指令fi
2)、双分支条件判断
if <条件表达式>thencommand 1elsecommand 2fi
3)、多分支条件判断
if <条件表达式>thencommand1elif <条件表达式>thencommand2elif <条件表达式>thencommand3elescommand4fi
4)、条件判断嵌套语法
#1、 test 条件表达式 if test 表达式thencommandfi#2、 []条件表达式if [字符集或算术表达式]thencommandfi#3、 [[]] 条件表达式if [[条件表达式]]thencommandfi#4、 (())条件表达式if((算术表达式))thencommandfi#5、 if 命令thencommandfi
5)、利用脚本发送电子邮件
通过Linux做事器客户端发送邮件及配置须要修正:vim /etc/mail.rcset from=1350115xxx@163.com smtp=smtp.163.comset smtp-auth-user=13501157xxx@163.com smtp-auth-password=1qaz2wc smtp-auth=login把稳:如果是163邮箱,须要设置邮箱的一个授权码,将授权吗写入smtp-auth-password,否则发送不了邮件邮件测试echo "this is a test" | mail -s "标题" 13501157xxx@163.com
for 有限循环for训话语法格式:
#for 变量 in 要授予的值#do # command1-N#done
for 循环获取变量值
#for i in 1 2 3 4 5#for i in I don"'"t know if this"'"ll work#for i in `ls /tmp`#for i in `cat file`#IFS=$':'(指定分隔符)#for i in `head -1 /etc/passwd`#do# echo "word:$i"#donefor 循环 c 措辞的写法#for (( i=0; i<10; i++))# do# echo $i#done#for (( a=0,b=9;a<10,b>=0;a=a+2,b=b-2 ))#do# echo $a $b#donefor 循环获取变量办法#for i in /tmp/#for i in `ls /tmp` do # if [ -f /tmp/$i ] # then # echo "$i is file" # else # echo "$i is folder" # fi#done
for 循环练习
# 利用循环打算1到100之间的和sum=0for ((i=0;i<=100;i++))do #let sum+=$i #((sum+=$i)) #sum=$[ $sum + $i ] #sum=$(expr $sum + $i )doneecho $sum
while 循环语法格式
# 语法格式:#while [ 条件 ] 条件为真#do# command#done# while 常用的方法#while [ 1 -eq 1 ]#while true#while :#until false#until :#do# date +%S# sleep 1#done
while 嵌套if条件判断
#while :# do# A=`date +%S`# if [ $A -gt 55 ]# then# exit# fi# echo $A# sleep 1#done
while 嵌套for循环
#while :# do# A=`date +%S`# for i in `seq 10 -1 1`# do# expr $A + $i# sleep 1# done#sleep 1#done
循环自增变量循环自增变量i=expr $i + 1;let i+=1;((i++));i=$[$i+1];i=$(( $i + 1 ))实例
#!/bin/bashi=0;while [ $i -lt 4 ];do echo $i; i=`expr $i + 1`; # let i+=1; # ((i++)); # i=$[$i+1]; # i=$(( $i + 1 ))done
until 循环(条件不成立循环)until 循环实行一系列命令直至条件为 true 时停滞。until 循环与 while 循环在处理办法上刚好相反。一样平常 while 循环优于 until 循环,但在某些时候—也只是极少数情形下,until 循环更加有用。until 语法格式
until conditiondo commanddone
break 命令不实行当前循环体内break下面的语句从当前循环退出.continue 命令是程序在本循体内忽略下面的语句,从循环头开始实行
实例:
for i in `seq 1 10` do if [ $i -eq 5 ] then# break continue fi echo $idone
case语句case语句的语法格式:
case $VARAIBLE in PAT1)分支1;;PAT2)分支2;;...)分支n;;esac
把稳: case支持glob风格的通配符: :任意长度的任意字符; ?:任意单个字符; []:范围内任意单个字符; a|b:a或b;
显示一个脚本做事菜单cpu) display cpu informationmem) display memory informationdisk) display disks informationquit) quit哀求:(1) 提示用户给出自己的选择; (2) 精确的选择则给出相应的信息;否则,则提示重新选择精确的选项; #!/bin/bash#cat << EOFcpu) display cpu informationmem) display memory infomationdisk) display disks informationquit) quit===============================EOFread -p "Enter your option: " optionwhile [ "$option" != "cpu" -a "$option" != "mem" -a "$option" != "disk" -a "$option" != "quit" ]; doecho "cpu, mem, disk, quit"read -p "Enter your option again: " optiondoneif [ "$option" == "cpu" ]; thenlscpuelif [ "$option" == "mem" ]; thenfree -melif [ "$option" == "disk" ]; thenfdisk -l /dev/[hs]d[a-z]elseecho "quit"exit 0fi
Array数组什么是数组arrayshell数组便是一个元素的凑集,它有限个数的元素(变量和字符内容),用一个名字来命名,用下标进行区分,这个名字就称为数组名,组成数组的变量称之为数组元素利用数组可以缩短和简化程序开拓array数组的定义数组的定义 及 增编削查
第一种方法:
array=(value1 value2 value3......)
第二种方法:
array=([1]=one [2]=two [3]=three) # 通过指定下标的办法定义数组
array=(1 2 3)# 查询数组所有元素echo ${array[]}# 显示数组的第一个元素echo ${array[1]}# 动态获取数组array=($(command))# 打印数组的所有元素echo ${array[|@]} # 获取数组的元素个数echo ${#array[|@]}#数组的赋值array[3]=four# 数组的删除unset array[1]# 数组内容的截取和更换array=(1 2 3)echo ${array[@]:1:3}echo ${array[@]/1/b}
select 循环菜单select也是循环的一种,它比较适宜用在用户选择的情形下。select 语法格式
select 变量名 [in 菜单取值列表]do 命令集done
#!/bin/bash fruits=( "add" "del" "select" "watermelon") PS3="please select a num from menu:" # 命令提示符echo "Please guess which fruit I like :"select var in ${fruits[@]} # ${fruits} 获取数组值do if [ $var = "add" ]; then echo "Congratulations, you are my good firend!" break else echo "Try again!" fidone
Function 函数函数的定义Shell 函数的实质是一段可以重复利用的脚本代码,这段代码被提前编写好了,放在了指定的位置,利用时直接调取即可。
Shell 函数定义的语法格式如下:
function name() { statements [return value]}
对各个部分的解释:
function是 Shell 中的关键字,专门用来定义函数;name是函数名;statements是函数要实行的代码,也便是一组语句;return value表示函数的返回值,个中 return 是 Shell 关键字,专门用在函数中返回一个值;这一部分可以写也可以不写。由{ }包围的部分称为函数体,调用一个函数,实际上便是实行函数体中的代码。
name() { statements [return value]}
函数调用
调用 Shell 函数时可以给它通报参数,也可以不通报。如果不通报参数,直接给出函数名字即可:
name
如果通报参数,那么多个参数之间以空格分隔:
name param1 param2 param3
不管是哪种形式,函数名字后面都不须要带括号。
和其它编程措辞不同的是,Shell 函数在定义时不能指明参数,但是在调用时却可以通报参数,并且给它通报什么参数它就吸收什么参数。
Shell 也不限定订义和调用的顺序,你可以将定义放在调用的前面,也可以反过来,将定义放在调用的后面。
函数的返回值 return函数的实行结果返回值:(1) 利用echo或printf命令进行输出; (2) 函数体中调用的命令的实行结果; 函数的退出状态码 1 - 255: (1) 默认取决于函数体中实行的末了一条命令的退出状态码; (2) 自定义:return
实例:添加10个用户,添加用户的功能利用函数实现,用户名作为参数通报给函数;
#!/bin/bash# 5: user existsaddusers() {if id $1 &> /dev/null; thenreturn 5elseuseradd $1retval=$?return $retvalfi}for i in {1..10}; doaddusers ${1}${i}retval=$?if [ $retval -eq 0 ]; thenecho "Add user ${1}${i} finished."elif [ $retval -eq 5 ]; thenecho "user ${1}${i} exists."elseecho "Unkown Error."fidone