shell编程
Page 40
示例
#!/bin/bash var=10
while [ $var -gt 0 ]
do
echo $var;((var--))
done
Page 41
until循环
语法 until 命令|表达式
Hi Dick Hi Harry Hi Joe
Page 35
示例
预先定义词表 #!/bin/sh
list="Alabama Alaska Arizona Arkansas"
for state in $list do echo "Have you ever visited $state?"
done
Page 30
升级的内存管理脚本
设计一个shell脚本,完成以下功能
– 查看当前空闲内存
– 若内存使用率超过上限,则将使用率发邮件给管理员
– 同时列出当前内存占用率最高的5个进程
Page 31
!/bin/bash tmpfile=`mktemp` user=root subject='mem infomation' max=70 used=`free | head -n 2 | tail -n 1 | awk '{print $3}'` total=`free | head -n 2 | tail -n 1 | awk '{print $2}'` ratio=`echo $used*100/$total | bc` if [ $ratio -gt $max ] then echo The mem% is $ratio% >$tmpfile echo The top five process are: >>$tmpfile ps aux | tail -n +2 | sort -nrk 4 | head -n 5 | awk '{print $4,$11}' >>$tmpfile mail -s "$subject" $user < $tmpfile fi rm -f $tmpfile
Page 13
课堂练习
自学sed的用法 将脚本中free=$(free | head -n 2 | tail -n 1 | awk '{print $4}')的head -n 2 | tail -n 1 用sed命令代替
Page 14
if语句
Page 15
if语句
语法:
if 命令|表达式 then 命令 ... fi
Page 23
file是普通文件
file是符号链接文件
条件表达式
内容 字符串测试 [ str1 == str2 ] [ str1 = str2 ]
测试结果为真时需满足的条件
两个字符串相等 同上
[ str1 != str2 ] [ str ]
[ ! str ] [ -z str ]
Page 24
编写简单的shell脚本
Page 8
内存管理脚本
设计一个shell脚本,完成以下功能
– 查看当前空闲内存
– 列出当前内存占用率最高的5个进程
– 将以上情况用邮件发送给root
Page 9
内存管理脚本-续
总体分析
– 内存使用情况需要的系统管理命令:free
– 将内存使用情况和5个进程写入临时文件
判断if后面的命令的退出状态值为0,或者表达式的值为真,执 行从then到fi之间的命令,否则直接跳到关键字fi下一行的命令 去执行
Page 16
if语句-续
if 命令|表达式 then
命令
else
命令
fi
Page 17
if语句-续
if 命令|表达式 then 命令 elif 命令|表达式 then 命令 elif 命令|表达式 then 命令 else 命令 fi
两个字符串不等 str的长度不为0
str的长度为0 str的长度为0
条件表达式-续
内容 逻辑测试
测试结果为真时需满足的条件
[ expr1 -a expr2 ]
[ expr1 -o expr2 ]
expr1和expr2都为真
expr1和expr2有一个为真
[ ! expr ]
expr为假,表达的基本概念
命名规则
– 以字母或下划线开头,后面可以是字母、0-9、下划线
赋值
– – – – 用等号给变量赋值,等号两侧不能有空格 var=aaa 或 var='aaa bbb' var是变量名,aaa和'aaa bbb'是变量值 变量值是空,但变量存在:var=
Page 21
Int1大于int2 Int1大于等于int2
Int1小于int2 int1小于等于int2
条件表达式-续
内容 文件测试
测试结果为真时需满足的条件
[ -e file ]
[ -s file ] [ -r file ] [ -w file ] [ -x file ]
file文件存在
file存在并且长度大于0 file存在并且是只读文件 file存在并且可写 file存在并且可执行
示例
#!/bin/bash String='' # Zero-length ("null") string variable. if [ -z "$String" ] then
echo "\$String is null."
else echo "\$String is NOT null."
fi
# $String is null.
Page 36
示例
从命令中读取词表 #!/bin/sh
file="states"
for state in `cat $file` do echo "Have you ever visited $state?"
done
Page 37
示例
用通配符读取词表 #!/bin/sh
for file in a[1-5]
[root@rhel ~]# name=Tom;na=tom [root@rhel ~]# [ $name = Tom -a $na = tom ]
Page 25
条件表达式-续
内容 字符串测试 [[ expr1 && expr2 ]] [[ expr1 || expr2 ]] [[ -n string ]] [[ string1 < string2 ]] [[ string1 > string2 ]]
– 发邮件给root
Page 10
内存管理脚本-续
需要第二行第四列的数据
– use=$(free | head -n 2 | tail -n 1 | awk '{print $4}')
Page 11
内存管理脚本-续
需要把所有进程按第四列排序,并取前五个进程
– ps aux | tail -n +2 | sort -nrk 4 | head -n 5 | awk '{print $4,$11}'
使用
– 若要使用变量的值,在变量名前面加上“$” – echo $var
删除变量:unset var
Page 3
局部变量与环境变量
局部变量:只对当前shell有效 环境变量:系统正常运行所必需的相关变量,子进程 继承父进程的所有环境变量
– 查看所有环境变量:env – 查看所有变量:set
Page 20
条件表达式-续
内容 整数比较测试 [ int1 -eq int2 ] [ int1 -ne int2 ]
测试结果为真时需满足的条件
int1等于int2 Int1不等于int2
[ int1 -gt int2 ] [ int1 -ge int2 ]
[ int1 -lt int2 ] [ int1 -le int2 ]
Page 22
条件表达式-续
内容 文件测试 [ -b file ] [ -c file ] [ -d file ] [ -S file ]
测试结果为真时需满足的条件
file是块文件 file是字符文件 file是目录文件 file存在并且是socket文件
[ -f file ]
[ -h file ] [ -L file ]
Page 18
示例
#!/bin/sh name=root
if grep $name /etc/passwd >/dev/null 2>&1
then
echo Found $name
fi
Page 19
表达式
if [ 表达式 ] then 命令 fi if [[ 表达式 ]] then 命令 fi if (( 表达式 )) then 命令 fi
测试结果为真时需满足的条件
expr1和expr2都为真 expr1和expr2有一个为真 string的长度不为0 排序时,string1排在string2前面 排序时,string1排在string2后面
Page 26
条件表达式-续
注意空格
– [ $name == tome ]
Page 27
Page 12
内存管理脚本-续
#!/bin/bash tmpfile=`mktemp` user=root subject='memory infomation' free=$(free | head -n 2 | tail -n 1 | awk '{print $4}') echo The free memory is $free >$tmpfile ps aux | tail -n +2 | sort -nrk 4 | head -n 5 | awk '{print $4,$11}' >>$tmpfile mail -s "$subject" $user < $tmpfile rm -f $tmpfile
linux操作系统任务十shell 编程基础
不被引号包围的字符串中出现变量时也会被解析,这一点和双引号" 不被引号包围的字符串 "包围的字符串一样。字符串中不能出现空格,否则空格后边的字符
串会作为其他变量或者命令解析。
管道操作
Shell数组中可以存放多个值。Bash Shell 只支持一维数组,初始化时不 需要定义数组大小。在 Shell 中用括号( )来表示数组,数组元素之间用空 格来分隔。定义数组的一般形式如下: Array_name=(ele1 ele2 ele3... eleN)
创建shell脚本
可以在Shell脚本中创建用户自定义变量,用户变量可以存储临时数据 并在整个脚本中使用,类似于程序语言中的变量。变量命名规则如下 :
1.任意字母数字或下划线,长度不超过20个,不能以数字开头; 2.用户变量区分大小写; 3.使用=赋值,变量、=、值之间不能有空格;
创建shell脚本
引用变量的时候一定要在前面加 $,对变量赋值的时候,被赋值的变量不需要 加 $。 有时候用户需存储某个命令的输出信息,可以把命令的输出赋值给变量,赋值 规则有两种: 1.`命令` ,`是反引号,不是引号。 2.$(命令)
例: LS=`ls` echo $LS echo "===================================" LSL=$(ls -l) echo $LSL
$a -ne $b
检测左边的数是否大于右边的,如果是返回 true。 $a -gt $b
检测左边的数是否小于右边的,如果是返回 true。 $a -lt $b
检测左边的数是否大于等于右边的,如果是返回 true。
检测左边的数是否小于等于右边的,如果是返回 true。
$a -ge $b [ $a -le $b ]
Shell编程(binsh和binbash)
Shell编程(/bin/sh和/bin/bash)保留字符及其含义shell变量条件测试命令表达式流程控制参考资料查看ubuntu支持的Shell:$ cat /etc/shells查看当前shell:$ echo $SHELL以下是sh Shell脚本编程,也适用于bash,差异之处已说明。
保留字符及其含义$ shell变量名的开始,如$var| 管道,将标准输出转到下一个命令的标准输入# 注释开始&在后台执行一个进程?匹配一个字符* 匹配0到多个字符(与DOS不同,可在文件名中间使用,并且含.) $- 使用set及执行时传递给shell的标志位$! 最后一个子进程的进程号$# 传递给shell script的参数个数$* 传递给shell script的参数$@ 所有参数,个别的用双引号括起来$? 上一个命令的返回代码$0 当前shell的名字$n (n:1-) 位置参数$$ 进程标识号(Process Identifier Number, PID)>file 输出重定向`command` 命令替换,如filename=`basename /usr/local/bin/tcsh` >>fiile输出重定向,append其他:$$dirls>filelistls >>filelistwc -l <filelistwc -l filelistsleep 5; echo 5 seconds reaches; ls -lps ax |egrepinetdfind / -name core -exec rm {} \; &filename=`date "+%Y%m%d"`.logshell变量Shell有如下四种变量:.用户自定义变量.位置变量即shell script之参数.预定义变量(特殊变量).环境变量(1)用户自定义变量(数据的存储)$ COUNT=1$ NAME="He Binwu"$ echo $NAME$ echo ${NAME}技巧:因为大部分UNIX命令使用小写字符,因此在shell编程中通常使用全大写变量,当然这并不是强制性的,但使用大写字符可以在编程中方便地识别变量。
Linux操作系统(第4版)shell编程
引用变量时,需在变量名前面加“$”符号。 • 使用变量时,需要在变量名前加“$”符号,
例如echo $season。当然使用时也会遇到一些 比较特殊的情况,就是变量名包含在其他字符 串中,这时就需要用“{}”将变量名括起来。
10.1.3 管道
• 管道和输入输出重定向十分类似。管道的 作用是在一个命令的标准输出和另一个命 令的标准输入之间建立一个通道。
10.1.4 shell里的特殊字符
• 和其他编程语言一样,shell里也有特殊字 符,常见的有美元符号“$”、反斜线“\” 和引号。美元符号表示变量替换,即用其 后指定的变量的值来代替变量。反斜线“\” 为转义字符,用于告诉shell不要对其后面 的那个字符进行特殊处理,只当作普通字 符。而shell下的引号情况比较复杂,分为3 种:双引号“"”、单引号“'”和倒引号 “`”。
• conditionN为分支条件,每个分支条件后必须以两个分号“;;” 结尾。如果都无法匹配,可用“*”代替,相当于default。 10.4.2小节中的if/elif/.../else结构多重分支语句示例也可改写 成如下形式。
• #!/bin/bash • case "$#" in • 0) echo "You didn't enter any parameter" • ;; • 1) echo "You entered only one parameter" • ;; • *) echo "You entered $# parameters" • ;; • esac • 当分支条件较多时,case语句将比if的多重分支显得简洁清晰。
shell编程基础知识点
shell编程基础知识点
一、Shell 编程基础知识
1、什么是 Shell
Shell 是一种用户使用的解释型程序,它是操作系统的一部分,派生自多种不同的系统。
它是一种命令解释器,它可以读取用户的输入,解释该输入,并执行相应的命令。
Linux 的 Shell 有很多种,如 bash,csh,ksh 等。
2、Shell 的特性
(1) 交互式:用户可以通过 Shell 的界面实现与计算机的交互,以便用户和计算机之间的信息交换。
(2) 自动化:Shell 可以将用户编写的一系列命令,保存为脚本,并在需要的时候自动执行,以减少用户的工作量。
(3) 扩展性:Shell 可以实现过滤和管道功能,可以与其他应用程序和编程语言结合使用,实现不同应用程序、不同编程语言之间的信息传递。
3、Shell 命令
(1)ls : 列出目录内容。
(2)cd : 改变目录。
(3)pwd : 显示当前所在目录。
(4)mkdir : 创建目录。
(5)rm : 删除文件或目录。
(6)cat : 显示文件内容。
(7)echo : 向屏幕输出指定字符串。
(8)exit : 退出当前 shell 环境。
(9)man : 查看指定命令的帮助文档。
(10)chmod : 改变文件权限。
shell编程入门
Shell程序设计学习内容:1.什么是shell2.语法:变量、条件判断、程序控制3.函数4.命令和命令的执行5.Here文档6.调试7.Grep命令和正则表达式8.Find命令一、什么是shell?Shell是一个作为用户与Linux系统间接口的程序,它允许用户向操作系统输入需要执行的命令。
在一个linux系统中可以安装多个shell,这些shell和其他程序一起环绕在linux内核四周。
默认安装的标准是/bin/sh,它是GNU工具集中的bash。
使用/bin/bash –version 可以查看版本。
Shell 历史版本:sh csh,、tcsh、zsh ksh、pdksh bash二、shell脚本编写、运行、调试1.脚本均以#!/bin/bash开头。
2.脚本中的‘#’为注释符。
3.使用exit为脚本设置返回一个退出码,注意0 表示的是执行成功。
示例:#!/bin/bash# this is my first shell!echo “helloword!”exit 04.设置脚本为可执行:chmod u+x filename.sh5.执行:./filename.sh6.sh –x ./filename.sh三、shell语法1、变量:无需事先声明,直接使用,在访问时要加$在变量前。
例如:Str=helloecho $Stra.这两行语句将在屏幕输出一个“hello”,shell区别大小写,定义变量时应该注意。
b.如果为变量所赋的字符串中含有空格,table或换行符应使用“”标示,例如“hello word!”c.变量在引号中依然有效如echo “this is $Str!”依然会输出:this is hello!练习示例:(注:后续的示例中只有关键部分,练习时补全) echo “input password:”read pasdecho “the password is $pasd”d.如果需要输出字符$Str可以用单引号和\来处理:‘$Str’和\$Str 输出的都是$Str不是变量表示的值,shell 中的变量一般都是字符串形式。
shell编程总结
shell编程总结
Shell编程是一种基于命令行的脚本编程语言,常用于Linux和Unix系统中。
本文将对Shell编程进行总结,包括以下内容:
1. Shell的基础知识:介绍Shell的定义、历史、发展以及Shell 与Linux的关系。
2. Shell脚本的格式:讲解Shell脚本的格式,包括文件头、变量、注释、命令等。
3. Shell命令:介绍常用的Shell命令,如ls、cd、cp、mv、rm、mkdir、cat等。
4. Shell的流程控制:讲解Shell脚本的流程控制语句,包括if语句、for循环、while循环、case语句等。
5. Shell函数:介绍Shell函数的定义、调用和传参等。
6. Shell的文本处理:讲解Shell脚本中的文本处理命令,如grep、sed、awk等。
7. Shell的正则表达式:介绍正则表达式的定义、语法和常用操作符等。
8. Shell的调试和错误处理:讲解Shell脚本的调试方法和错误处理语句,如set -x、set -e等。
9. Shell脚本的实战:通过实际案例介绍如何使用Shell脚本进行系统管理、日志分析、数据处理等。
通过本文的总结,读者可全面了解Shell编程的基础知识和常用技巧,提高Shell编程的能力。
linuxshell编程实验总结
Linux Shell 编程实验总结1.引言本文档总结了在学习Li nu xS he ll编程过程中的实验经验和心得体会。
通过对L in ux Sh el l编程实验的实施和总结,我们能够更好地理解S h el l脚本的运行机制,掌握Sh el l脚本的基本语法和常用命令,提高编写高效、精确的Sh e ll脚本的能力。
2.实验一:S hell 脚本基础2.1实验目的本实验旨在帮助学员熟悉Sh el l脚本的基本语法和常用命令,掌握脚本的编写与执行方法。
2.2实验内容在本实验中,我们学习了如何编写具有特定功能的Sh el l脚本,如输出H el lo Wo rl d、计算两个数之和、判断文件是否存在等。
2.3实验心得通过本实验的实施,我对Sh el l脚本的基本语法有了更深入的理解。
在编写脚本的过程中,我发现使用变量、条件判断和循环结构可以极大地提高脚本的灵活性和实用性。
同时,我也加深了对常用命令的认识和掌握,如e ch o、re ad、i f-e ls e、fo r循环等。
这些基本的知识将为后续的实验和项目实践打下坚实的基础。
3.实验二:文件和目录操作3.1实验目的本实验旨在帮助学员了解Li nu x文件系统的基本操作,掌握S he ll脚本中与文件和目录相关的命令。
3.2实验内容在本实验中,我们学习了如何创建、复制、重命名和删除文件、目录,以及如何查询文件和目录的属性信息等。
3.3实验心得通过本实验的实施,我对Li nu x文件系统有了更深入的了解。
我学会了如何使用S he ll脚本快速处理文件和目录,并且能够根据需求编写相应的脚本来操作文件。
例如,通过使用fi n d命令来查找文件,使用g r ep命令来搜索文件内容等。
这些技能在日常工作中非常有用,能够提高工作效率和准确性。
4.实验三:文本处理4.1实验目的本实验旨在帮助学员掌握Sh el l脚本中处理文本的常用命令和技巧,能够快速有效地处理常见的文本数据。
实验二:shell及shell编程
实验二:shell及shell编程1、实验目的1)sed的使用;2)awk的应用;3)shell及shell编程;4) 与用户启动相关的文件及使用。
2、实现设备一台装有Windows操作系统和Linux机系统的微机或服务器。
3、实验方法与注意事项1)由于是以root用户工作的,权力很大,请不要在系统内做对系统或对其他用户不安全的事情。
2)要求每个同学登录后系统后,要在自己的家目录内容以自己(汉语拼音)名字,使用mkdir命令创建一个子目录。
以后所有工作都要在自己的目录内进行。
3)认真编写实验报告4、实验过程1) sed命令的使用:(1) 将ifile文件中的所有sysman替换成System Manager并输出到ofilesed -e 's/sysman/System Manager/g' <ifile >ofile(2) 显示ifile文件中的所有注释行#sed -e '/^#/!d' < ifile #参见不执行某命令!function(3) 删除文件ifile中的空行,并将其它的内容输出到ofile:方法①#sed '/^$/d/^[<tab><Space>]*$/d' <ifile >ofile#注:tab为tab键,<tab>可用\t表示,<space>为空格键。
②也可写为:sed '/^$/d;/^[<tab><Space>]*$/d' <ifile >ofile 或写为sed '/^$/d;/^[[:blank:]]*$/d' <ifile >ofile 或写为sed '/^$/d;/^[[:space:]]*$/d' <ifile >ofile③如果脚本命令较多,也可将整个脚本内容写入文件(比如e_script)中,此时命令的执行可如下进行:sed –f e_script < ifile > ofile2) awk命令的使用(1) 显示系统内root的进程,它们是什么,进程号是多少ps -ef | awk '/root/{ print $1, $2, $8 }'(2) 显示系统所非root用户在干什么,他们是谁?ps -ef | awk '!/root/{ print $1, $8 }'(3) 使用awk计算文件infile内数字的和。
shell编程100例及代码注释——持续更新
shell编程100例及代码注释——持续更新1、编写hello world脚本#!/bin/bashecho"Hello World!"2、通过位置变量创建 Linux 系统账户及密码#!/bin/bashuseradd "$1"echo"$2" | passwd‐‐stdin "$1"#$1 是传给脚本的第⼀个参数,$2 是传给脚本的第⼆个参数# 命名为test.sh,保存退出,调⽤:# bash Test.sh yln 123# 创建了名为yln,密码为123的账户3、备份⽇志# 每周 5 使⽤ tar 命令备份/var/log 下的所有⽇志⽂件# 编写备份脚本,备份后的⽂件名包含⽇期标签,防⽌后⾯的备份将前⾯的备份数据覆盖#!/bin/bash# vim /root/logbak.shtar -czf log-`date +%Y%m%d`.tar.gz /var/log# date使⽤反引号括起来,反引号表⽰引号内部的字符作为命令执⾏,+%Y%m%d限定了date的格式是年⽉⽇,反引号在键盘<tab>键上⾯# 脚本调⽤:# crontab ‐e是指系统在某个时间执⾏的特定的命令或程序,后⾯的五个数字位是任务执⾏设置,分别代表分钟,⼩时,⽇,⽉,星期⼏调⽤logbak.shcrontab ‐e 0003 * * 5 /root/logbak.sh4、⼀键部署 LNMP(RPM 包版本)# LNMP是Linux + nginx + mysql + PHP,# 编译安装需要输⼊⼤量的命令,如果是配置⽣产环境需要耗费⼤量的时间。
# 搭建好LNMP环境之后就⽆需⼀个⼀个的输⼊命令,⽆需值守,编译安装优化编译参数,# 提⾼性能,解决不必要的软件间依赖,特别针对配置⾃动优化。
# ⼀键部署 LNMP(RPM 包版本)# 使⽤ yum 安装部署 LNMP,需要提前配置好 yum 源,否则该脚本会失败# 本脚本使⽤于 centos7.2 或 RHEL7.2#!/bin/bashyum‐y install httpd # httpd(⽹页伺服器)实际上是Apache,它快速、可靠并且可通过简单的API扩展,将Perl/Python等解释器编译到服务器中。
实验三 Shell脚本编程实验
实验三 Shell脚本编程实验一、实验目的1.掌握Shell编程的基本方法2.了解Shell脚本的基础知识二、实验要求1.完成一个简单Shell程序的编写和执行过程;2.设计一个Shell程序,显示欢迎界面;3.使用until语句创建一个输入exit退出的Shell程序。
三、实验准备Shell是一个命令语言解释器,它拥有自己内建的Shell命令集,Shell也能被系统中其他应用程序调用。
用户在提示符下输入的命令都由Shell解释后传给Linux核心。
Shell的另一个重要特性是它自身就是一个解释型的程序设计语言。
Shell程序设计语言支持绝大多数在高级语言中能见到的程序元素,如函数、变量、数组和程序控制结构。
Shell 编程语言简单易学,任何在提示符中能键入的命令都能放到一个执行的Shell程序中。
Shell脚本的建立和执行Shell程序可以存放在文件中,这种被Shell解释执行的命令文件称为Shell脚本(Shellscript),也称做Shell文件或者Shell过程。
Shell脚本可以包含任意从键盘输入的UNIX命令。
1)·.Shell脚本的建立建立Shell脚本的方法同建立普通文本文件的方法相同,利用编辑器(如vi)进行程序录入和编辑加工。
例如,要建立一个名为ex1的Shell的脚本,可以在提示符后打入命令:$ vi ex12). 执行Shell脚本的方式执行Shell脚本的方式基本上有三种:(1)输入定向到Shell这种方式是用输入重定向方式让Shell从给定文件中读入命令行并进行相应处理。
其一般形式是:$ sh < 脚本名例如,$ sh < ex1(2)以脚本名作为Shell参数。
其一般形式是:$ sh 脚本名[参数] 例如,$ sh ex2 /usr/mengqc/usr/liuzhy(3)将Shell脚本改为有执行权限的文件,由正文编辑器(如vi)建立的Shell脚本,用户通常是不能直接执行的,需要利用命令chmod将它改为有执行权限。
