Shell脚本-Demo-29例
shell循环详解及实例
shell循环详解及实例⼀、条件选择、判断(if、case)1.1 if语句⽤法及实例当我们在脚本中遇到需要判断的时候,我们就可以⽤if语句来实现。
具体的语法如下:单分⽀if 判断条件;then 条件为真的分⽀代码 fi双分⽀if 判断条件; then条件为真的分⽀代码else条件为假的分⽀代码fi多分⽀if 判断条件1; then条件为真的分⽀代码elif 判断条件2; then条件为真的分⽀代码elif 判断条件3; then条件为真的分⽀代码else以上条件都为假的分⽀代码fi在多分⽀中,系统会逐条判断你写⼊的条件,第⼀次遇到“真”条件时,执⾏该分⽀,⽽后结束整个if语句。
注意:1、if和fi是成对出现的2、if语句可以嵌套。
Example:1)判断两个数字的⼤⼩1 #!/bin/bash2 #定义变量3 read -p "Please input the first num:" num14 read -p "Please input the second num:" num25 #判断数字是否符合标准6 if [[ $num1 =~ ^[0-9]+$ && $num2 =~ ^[0-9]+$ ]];then7 # 判断两个数字的⼤⼩并输出判断结果8 if [ $num1 -lt $num2 ];then9 echo "The num2 is biger than the num1"10 elif [ $num1 -eq $num2 ];then11 echo "Two numbers equal"12 else13 echo "The num1 is biger than the num2"14 fi15 else16 echo "Please enter the correct number"17 fi1819 #删除变量20 unset num1 num22)编写脚本/root/bin/createuser.sh,实现如下功能:使⽤⼀个⽤户名做为参数,如果指定参数的⽤户存在,就显⽰其存在,否则添加之;显⽰添加的⽤户的id号等信息1 #!/bin/bash2 #定义变量3 read -p "请输⼊⼀个⽤户名:" name4 #判断⽤户名是否存在5 if `id $name &> /dev/null`;then6 # 若存在,则输出ID等信息7 echo "⽤户存在,⽤户的ID信息为:`id $name`"8 else9 # 若不存在,则添加⽤户,设置密码为随机8位,下次登录时提⽰修改密码,同时显⽰ID等信息10 passwd=`cat /dev/urandom |tr -cd [:alpha:] |head -c8`11 `useradd $name &> /dev/null`12 `echo "$passwd" | passwd --stdin $name &> /dev/null`13 echo "⽤户名:$name 密码: $passwd" >> user.txt14 `chage -d 0 $name`15 echo "⽤户已添加,⽤户的ID信息为:`id $name` 密码为:$passwd"16 fi1718 #删除变量19 unset name passwd1.2 case⽤法及实例当涉及到多个条件匹配的时候,我们⽤if可能就很⿇烦了,这个时候,我们就可以⽤case来编写这个脚本。
Shell 经典实例
Thizlinux 系统教程 Shell 经典实例----------------Milo经典小shell1 列目录树的shell脚本如下:#!/bin/sh# dtree: Usage: dtree [any directory]dir=${1:-.}(cd $dir; pwd)find $dir -type d -print | sort -f | sed -e "s,^$1,," -e "/^$/d" -e "s,[^/]*/([^/]*)$,`----1," -e "s,[^/]*/,| ,g"2 while中使用read (file是一个文件)cat file | while read linedoecho $lineecho " :: Please input any key(s):c"str4read=""while truedochr4read=`dd if=/dev/tty bs=1 count=1 2>/dev/null`str4read=$str4read$chr4readif [ "$chr4read" = "" ] ;then break; fidoneecho " :: |$str4read|"done3 将多个空格替换为字符sed 's/[ ][ ]*/ /g'如果空格与tab共存时用sed -e 's/[[:space:]][[:space:]]*/ /g' filename4用脚本实现分割文件#!/bin/bashif [ $# -ne 2 ]; thenecho 'Usage: split file size(in bytes)'exitfifile=$1size=$2if [ ! -f $file ]; thenecho "$file doesn't exist"exitfi#TODO: test if $size is a valid integerfilesize=`/bin/ls -l $file | awk '{print $5}'` echo filesize: $filesizelet pieces=$filesize/$sizelet remain=$filesize-$pieces*$sizeif [ $remain -gt 0 ]; thenlet pieces=$pieces+1fiecho pieces: $piecesi=0while [ $i -lt $pieces ];doecho split: $file.$i:dd if=$file of=$file.$i bs=$size count=1 skip=$i let i=$i+1doneecho "#!/bin/bash" > mergeecho "i=0" >> mergeecho "while [ $i -lt $pieces ];" >> mergeecho "do" >> mergeecho " echo merge: $file.$i" >> mergeecho " if [ ! -f $file.$i ]; then" >> mergeecho " echo merge: $file.$i missed" >> mergeecho " rm -f $file.merged" >> mergeecho " exit" >> mergeecho " fi" >> mergeecho " dd if=$file.$i of=$file.merged bs=$size count=1 seek=$i" >> merge echo " let i=$i+1" >> mergeecho "done" >> mergechmod u+x merge'5得到上月未日期,格式为YYYYMMDDget_lastday_of_lastmonth(){yy=`date +%Y`mm=`date +%m-1|bc`[ $mm -lt 1 ] && mm=12;yy=`expr $yy - 1`aaa=`cal $mm $yy`dd=`echo $aaa|awk '{print $NF}'`echo $yy$mm$dd}print $NF的$NF是打印最后一个列。
经典shell 脚本实例
fi
done
#!/bin/bash
if [ $# -le 0 ]
then
echo "Not enough parameters"
exit 1
fi
#string="2 3 4 5 6"
#set string
sum=0
while [ $# -gt 0 ]
do
sum=`expr $sum + $1`
shift
印出该数值,然后再次要求用户输入数值。直到用户输入"end"停止。#!/bin/sh
unset var
while [ "$var" != "end" ]
do
echo -n "please input a number: "
ቤተ መጻሕፍቲ ባይዱ
read var
if [ "$var" = "end" ]
then
break
fi
Linux shell 脚本实例
1. 写一个脚本,利用循环计算 10 的阶乘#!/bin/sh
factorial=1
for a in `seq 1 10`
do
factorial=`expr $factorial \* $a`
done
echo "10! = $factorial"
2. 写一个脚本,执行后,打印一行提示“Please input a number:",要求用户输入数值,然后打
esac done #! /bin/sh a=10 b=20 c=30 value1=`expr $a + $b + $c` echo "The value of value1 is $value1" value2=`expr $c / $b` echo "The value of value2 is $value2" value3=`expr $c * $b` echo "The value of value3 is $value3" value4=`expr $a + $c / $b` echo "The value of value4 is $value4" var4=`expr $value4 - $value2` echo $var4
shell脚本编程(完结版)
if [ 条件表达式 2 ] then …… …… else …… …… fi
命令串; else
命令串; fi
如有任何疑问,请联系作者,作者 QQ:1028150787,或者到韦脚本编程学习笔记 2013 年 5 月 2 日 追风~忆梦
1. 整数测试运算
test int1 -eq int2: 判断两个数是否相等 test int1 -ne int2: 判断两个数是否不相等 test int1 -gt int2: 判断整数 1 是否大于整数 2 test int1 -ge int2: 判断整数 1 是否大于等于整数 2 test int1 -lt int2: 判断整数 1 是否小于整数 2 test int1 -le int2: 判断整数 1 是否小于等于整数 2 整数测试也可以使用 let 命令或双圆括号 相关操作为:== 、!= 、> 、>= 、< 、<= 如: x=1; [ $x -eq 1 ]; echo $? x=1; let "$x == 1"; echo $? x=1; (($x+1>= 2 )); echo $? 两种测试方法的区别: 使用的操作符不同 let 和 双圆括号中可以使用算术表达式,而中括号不能 let 和 双圆括号中,操作符两边可以不留空格
1. 整数测试运算 .................................................4 2. 字符串测试运算 ...............................................4 3. 文件测试运算 .................................................5 4. 逻辑运算 .....................................................5 第二节 在 shell 脚本中进行条件控制 ................................ 5 第三节 在 shell 脚本中进行 for 循环 ................................ 7 第四节 在 shell 脚本中进行 while 循环 .............................. 8 第五节 在 shell 脚本中使用 util 循环 ............................... 8 第六节 在 shell 脚本中使用函数 .................................... 8 第七节 shell 脚本之 echo 和 expr 讲解 ................................ 9 第八节 shell 脚本循环终止之 break 和 continue ..................... 10 第九节 shell 脚本之 exit 和 sleep ................................. 11 第十节 shell 脚本之 select 循环与菜单 ............................. 11 第十一节 shell 脚本之循环控制 shift 命令 .......................... 11 第十二节 shell 脚本之字符串操作 ................................... 11 第十三节 shell 脚本之数组实现 ..................................... 12 第十四节 shell 脚本之脚本调试 ..................................... 12 第十五节 shell 脚本之编程小结 ..................................... 12 程序例程 ......................................................... 14 习题实训 ......................................................... 29 综合实例 ......................................................... 31 1. 需求分析....................................................31 2.系统设计 ....................................................31 3.程序代码 ....................................................31 声明 ............................................................. 35
shell脚本常用命令
shell脚本常⽤命令shell基本命令1.#!/bin/sh是指此脚本使⽤/bin/sh来解释执⾏。
解释:#! 是⼀个约定的标记,它告诉系统这个脚本需要什么解释器来执⾏,即使⽤哪⼀种 Shell。
2.echo 命令⽤于向窗⼝输出⽂本。
举例:echo "Hello World !"3.your_name="qinjx"赋值变量echo ${your_name}打印变量;使⽤变量的时候加括号和美元符4.chmod +x ./test.sh #使脚本具有执⾏权限./test.sh #执⾏脚本chmod 777 /tmp -R 意思是把tmp⽂件夹及其⼦bai⽂件夹的权限全部修改为777解释语句⼀:ping -c 5 > /dev/null 2>&11. ping -c 5 -c<完成次数>:设置完成要求回应的次数;2. >/dev/null这条命令的作⽤是将标准输出1重定向到/dev/null中。
/dev/null代表linux的空设备⽂件,所有往这个⽂件⾥⾯写⼊的内容都会丢失,俗称“⿊洞”。
那么执⾏了>/dev/null之后,标准输出就会不再存在,没有任何地⽅能够找到输出的内容。
3. 2>&1这条命令⽤到了重定向绑定,采⽤&可以将两个输出绑定在⼀起。
这条命令的作⽤是错误输出将和标准输出同⽤⼀个⽂件描述符,说⼈话就是错误输出将会和标准输出输出到同⼀个地⽅。
linux在执⾏shell命令之前,就会确定好所有的输⼊输出位置,并且从左到右依次执⾏重定向的命令,所以>/dev/null 2>&1的作⽤就是让标准输出重定向到/dev/null中(丢弃标准输出),然后错误输出由于重⽤了标准输出的描述符,所以错误输出也被定向到了/dev/null中,错误输出同样也被丢弃了。
执⾏了这条命令之后,该条shell命令将不会输出任何信息到控制台,也不会有任何信息输出到⽂件中。
常用shell脚本指令
常用shell脚本命令1、显示包含文字aaa的下一行的内容:sed -n '/aaa/{n;p;}' filename2、删除当前行与下一行的内容:sed -i '/aaa/{N;d;}' filename3、删除当前行与下两行的内容:sed -i '/aaa/{N;N;d;}' filename依次类推,删除三行,则为{N;N;N;d;},分析知:N为next4、得出以空格为分割的字符串中单词的个数,即统计个数:awk ' { print NF } '如显示字符串VALUE中的单词个数,其中VALUE为:aaa bbb ccc ddd ee f则执行 echo $VALUE | awk ' { print NF } ' 后的结果为65、在linux中建立一个文件与另一文件的链接,即符号链接ln -s /var/named/chroot/etc/named.conf named.conf这要就建立了当前目录的文件named.conf对/var/named/chroot/etc/named.conf 的符号链接。
即操作named.conf就意味着操作实际文件/var/named/chroot/etc/named.conf ,这时用ll命令查看的结果如:lrwxrwxrwx 1 root root 32 Mar 22 12:29 named.conf ->/var/named/chroot/etc/named.conf注意:当用sed来通过named.conf来删除一部分信息时,会将符号链接的关系丢掉,即会将named.conf变成一个实际文件。
所以需对实际文件进行删除操作。
6、显示指定字符范围内的内容:如:显示文件test.txt中字符#test begin与#test end之间所有的字符sed -n "/#test begin/,/#test end/p" test.txt或 awk "/#test begin/,/#test end/" test.txt在日常系统管理工作中,需要编写脚本来完成特定的功能,编写shell脚本是一个基本功了!在编写的过程中,掌握一些常用的技巧和语法就可以完成大部分功能了,也就是2/8原则.1. 单引号和双引号的区别单引号与双引号的最大不同在于双引号仍然可以引用变量的内容,但单引号内仅是普通字符,不会作变量的引用,直接输出字符窜。
shell脚本100例、练习使用
shell脚本100例、练习使⽤1、编写hello world脚本#!/bin/bashecho"hello world"2、通过位置变量创建linux系统账户和密码#!/bin/bash#$1是执⾏脚本第⼀个参数 $2是执⾏脚本第⼆个参数useradd "$1"echo"$2" | passwd --stdin "$1"#测试脚本[root@template-host sh1]# sh2.sh aaa 123Changing password for user aaa.passwd: all authentication tokens updated successfully.#测试登录[root@template-host sh1]# su - aaa[aaa@template-host ~]$3、每周五使⽤tar命令备份 /var/log下的所有⽇志⽂件#!/bin/bashtar -czPf log-`date +%y%m%d`.tar.gz /var/log #加P是因为如果不加会出现错误:tar: Removing leading `/' from member names date和+之间注意有空格。
修改系统参数[root@template-host sh1]# crontab -e00 03 * * 5 /data/sh1/3.sh4、⼀键部署LNMP(RPM包版本)#!/bin/bash#此脚本需要提前配置yum源,否则⽆法配置成功。
本脚本使⽤于7.4yum -y install httpdyum -y install mariadb mariadb-devel mariadb-serveryum -y install php php-mysqlsystemctl start httpd mariadb #启动httpd、mariadbsystemctl enable httpd mariadb #加⼊开机⾃启动systemctl status httpd mariadb #查看是否成功5、实时监控本机硬盘内存剩余空间,剩余内存空间⼩于500M,根分区剩余空间⼩于1000M时,发送警报信息到命令⾏#!bin/bash#提取分区剩余空间单位:kbdisk_size=$(df / | awk'/\//{print $4}')#提取内存空间单位Mmem_size=$(free -m | awk'/Mem/{print $4}')while :doif [ $disk_size -le 512000 -o $mem_size -le 1024 ];thenecho"警报:资源不⾜"sleep5fidone6、随机⽣成⼀个100以内的随机数,提⽰⽤户猜数字,提⽰⽤户猜⼤了、猜⼩了、猜对了,直⾄⽤户猜对,脚本结束。
shell脚本介绍以及常用命令
shell脚本介绍以及常⽤命令Shell脚本Shell Script,Shell与Windows/Dos下的相似,也就是⽤各类命令预先放⼊到⼀个⽂件中,⽅便⼀次性执⾏的⼀个,主要是⽅便进⾏设置或者管理⽤的。
但是它⽐Windows下的批处理更强⼤,⽐⽤其他编程的程序效率更⾼,毕竟它使⽤了Linux/Unix下的命令。
换⼀种说法也就是,shell script是利⽤shell的功能所写的⼀个程序,这个程序是使⽤,将⼀些shell的语法与指令写在⾥⾯,然后⽤正规表⽰法,管线命令以及数据流重导向等功能,以达到我们所想要的处理⽬的shell和shell脚本的区别:shell是什么呢?确切⼀点说,Shell就是⼀个,它的作⽤就是遵循⼀定的语法将输⼊的命令加以解释并传给系统。
它为⽤户提供了⼀个向Linux发送请求以便运⾏程序的接⼝系统级程序,⽤户可以⽤Shell来启动、挂起、停⽌甚3⾄是编写⼀些程序。
Shell本⾝是⼀个⽤C语⾔编写的程序,它是⽤户使⽤Linux的桥梁。
Shell既是⼀种命令语⾔,⼜是⼀种(就是你所说的shell脚本)。
作为命令语⾔,它互动式地解释和执⾏⽤户输⼊的命令;作为程序设计语⾔,它定义了各种和参数,并提供了许多在⾼阶语⾔中才具有的控制结构,包括循环和分⽀。
它虽然不是 Linux系统的⼀部分,但它调⽤了系统内核的⼤部分功能来执⾏程序、创建⽂档并以并⾏的⽅式协调各个程序的运⾏。
交互式shell和⾮交互式shell 交互式模式就是shell等待你的输⼊,并且执⾏你提交的命令。
这种模式被称作交互式是因为shell与⽤户进⾏交互。
这种模式也是⼤多数⽤户⾮常熟悉的:登录、执⾏⼀些命令、签退。
当你签退后,shell也终⽌了。
shell也可以运⾏在另外⼀种模式:⾮交互式模式。
在这种模式下,shell不与你进⾏交互,⽽是读取存放在⽂件中的命令,并且执⾏它们。
当它读到⽂件的结尾,shell也就终⽌了。
Linux_基础教程--Shell脚本编程
学习各种管理和监视命令的使用
学习各种文本文件工具的使用
2014年12月24日
变量和表达式
2014年12月24日
18
Shell 变量操作
变量替换扩展
输入
变量测试 变量的字符串操作 变量的间接引用 $[expression] $((expression)) expr let declare -i
Shell 脚本的执行
PATH 环境变量的默认值不包含当前目录, 若脚本文件在当前目录,应使用 ./script-file
PATH 环境变量的默认值包含 ~/bin 目录, 用户可以将自己的脚本文件存放在 ~/bin 目录, 之后即可直接调用脚本文件名执行脚本了
2014年12月24日
7
Shell 脚本的编码规范
${var/%old/new}
用new替换${var}中结尾部分与old匹配的部分
注: (1)old 中可以使用 通配符。 (2)var 可以是 @ 或 *,表示对每个位置参数进行替换
sh –n 脚本名
对脚本进行语法检查,但不执行脚本。如果存在语法错误,shell 会报错,如果没有错误,则不显示任何内容。
2014年12月24日
12
脚本调试举例 1
对脚本进行语法检查
$ bash -n greetings.sh
显示脚本中每个原始命令行及其执行结果
$ bash -v greetings.sh
2014年12月24日 22
字符串变量替换扩展举例1
str='I love linux. I love UNIX too.‟
Shell脚本-从入门到精通
ex4if.sh,chkperm.sh,chkperm2.sh, name_grep,tellme,tellme2,idcheck.sh
第22页,共74页。
ex4if.sh
#!/bin/bash # scriptname: ex4if.sh
# echo -n "Please input x,y: "
echo echo –e "Hello $LOGNAME, \c"
echo "it's nice talking to you." echo "Your present working directory is:" pwd # Show the name of present directory
echo
then
# 那么
commands1 # 执行语句块 commands1
elif expr2 # 若expr1 不真,而expr2 为真
then
# 那么
commands2 # 执行语句块 commands2
... ...
# 可以有多个 elif 语句
else
# else 最多只能有一个
commands4 # 执行语句块 commands4
\t 插入tab; \v 与\f相同; \\ 插入\字符; \nnn 插入nnn(八进制)所代表的ASCII字符; --help 显示帮助
--version 显示版本信息
第8页,共74页。
Shell 脚本举例
#!/bin/bash
# This script is to test the usage of read # Scriptname: ex4read.sh echo "=== examples for testing read ===" echo -e "What is your name? \c" read name echo "Hello $name" echo echo -n "Where do you work? "
shell脚本基础(又长又详细)
shell脚本基础(⼜长⼜详细)第⼗⼀章 BASH脚本(⼀)常见的Shell变量的类型包括环境变量、预定义变量、位置变量、⽤户⾃定义变量。
本节将分别学习这四种Shell变量的使⽤。
11. 1、 Shell的环境变量通过set命令可以查看系统中所有Shell变量(包括环境变量和⽤户⾃定义变量),由于内容输出较多,建议使⽤less命令分页查看。
常⽤环境变量:PATH 决定了shell将到哪些⽬录中寻找命令或程序HOME 当前⽤户主⽬录HISTSIZE 历史记录数LOGNAME 当前⽤户的登录名USER 当前⽤户名UID 当前⽤名的UIDHOSTNAME 指主机的名称SHELL 前⽤户Shell类型LANGUGE 语⾔相关的环境变量,多语⾔可以修改此环境变量MAIL 当前⽤户的邮件存放⽬录PS1 基本提⽰符,对于root⽤户是#,对于普通⽤户是$PS2 附属提⽰符,默认是“>”例:以分号分隔,显⽰当前的⽤户的⽤户名、宿主⽬录、登录Shell。
例:查看当前命令的搜索路径,并将/opt/bin⽬录添加到现有搜索路径中去,从⽽可以直接执⾏此⽬录中的命令。
环境变量的配置⽂件⽤户可在当前的Shell环境中直接为环境变量赋值,但需要长期变更所使⽤的某个环境变量时,可以修改配置⽂件。
在Linux系统中,⽤户环境变量的设置⼯作习惯上在 /etc/profile ⽂件及宿主⽬录中 .bash_profile⽂件中进⾏,前者称为全局配置⽂件(对所有⽤户起作⽤),后者称为⽤户配置⽂件(允许覆盖全局配置)。
例:在当前⽤户环境中,将⽤于限制历史命令的环境变量HISTSIZE的值改为100。
例:编辑“~/.bash_profile”⽂件,修改PATH的设置,以便⽤户在下次登录后能够使⽤服务/opt/bin ⽬录作为默认的搜索路径。
# vi /root/.bash_profielPATH=$PATH:$HOME/bin:/opt/binExport PATH11.2 Shell位置变量为了在使⽤Linux程序时,⽅便通过命令⾏给程序提供操作参数,Bash引⼊了位置变量的概念。
Shell脚本常用模板
Shell脚本常⽤模板 作为⼀个运维⼈员编写Shell脚本是很平常的,⼀个格式好的脚本不仅赏⼼悦⽬,后期⾃⼰和别⼈也易于维护。
下⾯的脚本就是我⾃⼰的shell编写格式,如下:1 [root@mini05 20180930-2]# cat template.sh2 #!/bin/sh3 ################ Version Info ##################4 # Create Date: 2018-09-295 # Author: Zhang6 # Mail: zhang@7 # Version: 1.08 # Attention: shell脚本模板9 ################################################1011 # 加载环境变量12 # 如果脚本放到crontab中执⾏,会缺少环境变量,所以需要添加以下3⾏13 . /etc/profile14 . ~/.bash_profile15 . /etc/bashrc1617 # 脚本所在⽬录即脚本名称18 script_dir=$( cd "$( dirname "$0" )" && pwd )19 script_name=$(basename ${0})20 # ⽇志⽬录21 log_dir="${script_dir}/log"22 [ ! -d ${log_dir} ] && {23mkdir -p ${log_dir}24 }2526 errorMsg(){27echo"USAGE:$0 arg1 arg2 arg3"28 exit 229 }303132 doCode() {33echo $134echo $235echo $336 }3738 main() {39if [ $# -ne 3 ];then40 errorMsg41fi42 doCode "$1""$2""$3"43 }4445 # 需要把隐号加上,不然传⼊的参数就不能有空格46 main "$@"测试如下:1 [root@mini05 20180930-2]# ./template.sh2 USAGE:./template.sh arg1 arg2 arg33 [root@mini05 20180930-2]# ./template.sh1114 USAGE:./template.sh arg1 arg2 arg35 [root@mini05 20180930-2]# ./template.sh111'222 333'6 USAGE:./template.sh arg1 arg2 arg37 [root@mini05 20180930-2]# ./template.sh111'222 333'"444 555"811192223331044455511 [root@mini05 20180930-2]# ./template.sh111'222 333'"444 555""666"12 USAGE:./template.sh arg1 arg2 arg3。
shell脚本教程详细讲解
1、VI的三种工作模式
命令模式
启辑动,V只I能默接认受进命入令命令(键模入式的。命此令时看界不面到不)能编 文件的保存,退出,文本的删除、复制、搜
内部变量 由系统提供的。与环境变量不同,但用户不能 修改它们。
本地变量和环境变量的对比
1、本地变量(局部变量、用户变量)
本地变量 在用户现在的shell生命期的脚本中使用 变量名=值
:#,# s /SEARCH /REPLACE /g
#号表示数字,表示从多少行到多少行,把 SEARCH替换成REPLACE;
:s /SEARCH /REPLACE /g
把当前光标所在行中的SEARCH单词,替换 成REPLACE,并把所有SEARCH高亮显示
7、设置vi
全局的配置文件位于/etc/vim/vimrc(或者/etc/vimrc) 也可以拥有自己独立的配置文件,配置文件位
双引号内; 7. 先执行 1G 或 gg 后,直接输入 /bzip2 8. 直接执行 :50,100s/man/MAN/gc 即可 9. (1)简单的方法可以一直按 u 恢复到原始状态,(2)使用不
储存离开 :q! 之后,再重新读取一次该文件; 10. 51G 然后再 10yy 之后按下 G 到最后一行,再p粘贴10
本(包括当前行)
u:恢复刚才被修改的文本 U:恢复光标所在行的所有修改 .:重复上一次命令的操作
命令模式下的操作:文本复制、粘贴
复制命令:y
yy: 复制整行 yw:复制光标所在的单词 nyw:复制包括光标所在的n个单词 nyy:复制包括当前行在内的n行
shell编程题经典100例
shell编程题经典100例 1. 显示当前路径```shellpwd```2. 列出当前目录中的文件和目录```shellls```3. 创建一个新的目录```shellmkdir <目录名> ```4. 删除一个目录 ```shellrmdir <目录名> ```5. 删除一个文件 ```shellrm <文件名>```6. 复制一个文件```shellcp <源文件> <目标文件> ```7. 移动一个文件```shellmv <源文件> <目标文件> ```8. 重命名一个文件```shellmv <旧文件名> <新文件名> ```9. 创建一个符号链接```shellln -s <源文件> <符号链接> ```10. 显示一个文件的详细信息 ```shellls -l <文件名>```11. 显示一个目录的详细信息 ```shellls -ld <目录名>```12. 查找一个文件```shellfind <路径> -name <文件名> ```13. 搜索文本字符串```shellgrep <字符串> <文件>```14. 显示一个文件的指定行```shellhead -n <行数> <文件>```15. 显示一个文件的最后几行 ```shelltail -n <行数> <文件>```16. 比较两个文件```shelldiff <文件1> <文件2>```17. 合并两个文件```shellcat <文件1> <文件2> > <输出文件> ```18. 运行一个命令```shellcommand <参数>```19. 管道命令```shellcommand1 | command2```20. 重定向输出```shellcommand > <输出文件> ```21. 重定向输入```shellcommand < <输入文件> ```22. 使用环境变量```shellecho $PATH```23. 设置环境变量```shellPATH=/usr/bin:/bin export PATH```24. 创建一个脚本```shell#!/bin/bash# 脚本内容```25. 运行一个脚本 ```shell./<脚本名>```26. 调试一个脚本 ```shellbash -x <脚本名> ```27. 使用case语句 ```shellcase $1 in"start")# 执行启动命令;;"stop")# 执行停止命令;;esac```28. 使用if语句```shellif [ $1 -gt 10 ]; then# 执行条件为真的命令 else# 执行条件为假的命令 fi```29. 使用for循环```shellfor i in 1 2 3 4 5; do # 迭代执行命令done```30. 使用while循环```shellwhile [ $i -lt 10 ]; do # 循环执行命令i=$((i+1))done```31. 使用until循环```shelluntil [ $i -gt 10 ]; do # 循环执行命令i=$((i+1))done```32. 使用函数```shellfunction my_function() { # 函数体}my_function```33. 使用数组```shellarr=(1 2 3 4 5)echo ${arr[2]}```34. 使用字典```shelldeclare -A dictdict["name"]="John Doe" echo ${dict["name"]}```35. 使用正则表达式```shellif [[ $string =~ ^[[:alpha:]]+$ ]]; then # 匹配以字母开头的字符串fi```36. 使用管道符```shellls | grep "txt"```37. 使用换行符```shellecho -e "Line 1\nLine 2"```38. 使用引号```shellecho "This is a string with spaces"```39. 使用转义字符```shellecho "This is a string with a \n newline" ```40. 使用注释```shell# 这是一行注释```41. 使用条件?:```shellresult=$(if [ $condition ]; then echo "true"; else echo "false"; fi)```42. 使用切片```shellecho "${string:0:3}"```43. 使用join命令```shellecho $( IFS=","; echo "${array[]}" ) ```44. 使用read命令```shellread -p "Enter your name: " name```45. 使用变量赋值```shellvar=$(expr 1 + 2)```46. 使用算术运算```shell(( i++ ))```47. 使用逻辑运算符```shellif [[ $condition1 && $condition2 ]]; then # 条件 1 和条件 2 都为真fi48. 使用比较运算符```shellif [[ $var -gt 10 ]]; then # var 大于 10fi```49. 使用测试命令```shellif test -f <文件>; then# 文件存在```50. 使用getopts解析命令行参数 ```shellwhile getopts ":ab:" opt; do case $opt ina)flag_a=true;;b)arg_b=$OPTARG;; esac done```。
分享70个经典的Shell脚本面试题与答案
分享70个经典的Shell脚本⾯试题与答案我们为你的⾯试准备选择了 70 个你可能遇到的 shell 脚本⾯试问题及解答。
了解脚本或⾄少知道基础知识对系统管理员来说⾄关重要,它也有助于你在⼯作环境中⾃动完成很多任务。
在过去的⼏年⾥,我们注意到所有的 linux ⼯作职位都要求脚本技能。
1) 如何向脚本传递参数 ?./script argument例⼦: 显⽰⽂件名称脚本./show.sh file1.txtcat show.sh#!/bin/bashecho $1(LCTT 译注:谢谢某匿名访客的提醒,原题有误,修改之。
)2) 如何在脚本中使⽤参数 ?第⼀个参数 : $1,第⼆个参数 : $2例⼦ : 脚本会复制⽂件(arg1) 到⽬标地址(arg2)./copy.sh file1.txt /tmp/cat copy.sh#!/bin/bashcp $1 $23) 如何计算传递进来的参数 ?$#4) 如何在脚本中获取脚本名称 ?$05) 如何检查之前的命令是否运⾏成功 ?$?6) 如何获取⽂件的最后⼀⾏ ?tail-17) 如何获取⽂件的第⼀⾏ ?head-18) 如何获取⼀个⽂件每⼀⾏的第三个元素 ?awk'{print $3}'9) 假如⽂件中每⾏第⼀个元素是 FIND,如何获取第⼆个元素awk'{ if ($1 == "FIND") print $2}'10) 如何调试 bash 脚本将-xv参数加到#!/bin/bash后例⼦:#!/bin/bash –xv11) 举例如何写⼀个函数 ?function example {echo "Hello world!"}12) 如何向连接两个字符串 ?V1="Hello"V2="World"V3=${V1}${V2}echo $V3输出HelloWorld13) 如何进⾏两个整数相加 ?V1=1V2=2let V3=$V1+$V2echo $V3输出3据 @kashu 的意见,本题的更佳回答为:两个整数相加,还有若⼲种⽅法实现:A=5B=6echo $(($A+$B)) # ⽅法 2echo $[$A+$B] # ⽅法 3expr $A + $B # ⽅法 4echo $A+$B | bc # ⽅法 5awk 'BEGIN{print '"$A"'+'"$B"'}' # ⽅法 614) 如何检查⽂件系统中是否存在某个⽂件 ?if [ -f /var/log/messages ]thenecho "File exists"fi15) 写出 shell 脚本中所有循环语法 ?for 循环 :foriin$(ls);doecho item:$idonewhile 循环 :#!/bin/bashCOUNTER=0while [ $COUNTER -lt 10 ]; doecho The counter is $COUNTERlet COUNTER=COUNTER+1doneuntil 循环 :#!/bin/bashCOUNTER=20until [ $COUNTER -lt 10 ]; doecho COUNTER $COUNTERlet COUNTER-=1done16) 每个脚本开始的#!/bin/sh或#!/bin/bash表⽰什么意思 ?这⼀⾏说明要使⽤的shell。
shell脚本练习题
shell脚本例子集锦(习题总结)练习一:写一个脚本1.设定变量FILE的值为/etc/passwd2.依次向/etc/passwd中的每个用户问好,并且说出对方的ID是什么形如:(提示:LINE=`wc -l /etc/passwd | cut -d" " -f1`)Hello,root,your UID is 0.3.统计一个有多少个用户答案一:#!/bin/bashfile="/etc/passwd"LINES=`wc -l $file | cut -d" " -f1`for I in `seq 1 $LINES`;douserid=`head -$I $file | tail -1 |cut -d: -f3`username=`head -$I $file | tail -1 |cut -d: -f1`echo "hello $username,your UID is $userid"doneecho "there are $LINES users"答案二:#!/bin/bashfile=/etc/passwdlet num=0for I in `cat $file`;dousername=`echo "$I" | cut -d: -f1`userid=`echo "$I" | cut -d: -f3`echo "Hello,$username,your UID is $userid"num=$[$num+1]doneecho "there are $num users"练习二:写一个脚本1.切换工作目录至/var2.依次向/var目录中的每个文件或子目录问好,形如:(提示:for FILE in /var/*;或for FILE in `ls /var`;)Hello,log3.统计/var目录下共有多个文件,并显示出来答案:#!/bin/bashcd /varlet num=0for I in `ls /var/*`;doecho "hello $I"num=$[$num+1]doneecho "the number of files is $num"练习三:写一个脚本1.设定变量file的值为/etc/passwd2.使用循环读取文件/etc/passwd的第2,4,6,10,13,15行,并显示其内容3.把这些行保存至/tmp/mypasswd文件中答案:#!/bin/bashfile="/etc/passwd"for I in 2 4 6 10 13 15;doexec 3>/tmp/mypasswdline=`head -$I $file | tail -1`echo "$line"echo "$line" >&3exec 3>&-done练习四:写一个脚本传递两个整数给脚本,让脚本分别计算并显示这两个整数的和,差,积,商答案如下:vim test.sh#!/bin/bashecho "first number $1" (表示输出第一个数)echo "second number $2" (表示输出第二个数)echo "$(($1+$2))" (输出两数之和)echo"$[$1-$2]" (输出两数之差)echo"$[$1*$2]" (输出两数之积)echo"$[$1/$2]" (输出两数之商):wq(表示保存并退出vi编辑器)chmod +xtest.sh (给test.sh执行的权限)./test.sh 23 (传递两个参数并执行脚本作业一:写一个脚本:1.创建目录/tmp/scripts2.切换工作目录至此目录中3.复制/etc/pam.d目录至当前目录,并重命名为test4.将当前目录的test及其里面的文件和子目录的属主改为redhat5.将test及其子目录中的文件的其它用户的权限改为没有任何权限答案:#!/bin/bashmkdir -v /tmp/scriptscd /tmp/scriptscp -r /etc/pam.d ./testchown -R redhat ./testchmod -R o=--- ./test作业二:写一个脚本1.显示当前系统日期和时间,而后创建目录/tmp/lstest2.切换工作目录至/tmp/lstest3.创建目录a1d,b56e,6test4.创建空文件xy,x2y,7325.列出当前目录下以a,x或者6开头的文件或目录6.列出当前目录下以字母开头,后跟一个任意数字,而后跟任意长度字符的文件或目录答案:#!/bin/bashdatemkdir -pv /tmp/lstestcd /tmp/lstestmkdir a1d b56e 6testtouch xy x2y 732ls [ax6]*ls [[:alpha:]][[:digit:]]*作业三:写一个脚本添加10个用户user1到user10,但要求只有用户不存在的情况下才能添加答案:#!/bin/bashfor I in `seq 1 10`;docut -d: -f1 /etc/passwd |grep "user$I" 2>>/tmp/etc.err || useradd user$Idone作业四:写一个脚本通过ping命令测试192.168.0.151到192.168.0.254之间的所有主机是否在线如果在线,就显示“ip is up”如果不在线,就显示“ip is down”答案: #!/bin/bashfor I in `seq 151 254`;doping -c1 -w1 192.168.0.$I &>/dev/null && echo "192.168.0.$I is up" || echo "192.168.0.$I is down"done例题:shell1.sh 显示日期和时间。
linuxshell编程案例
linuxshell编程案例Linux Shell编程案例Shell编程是一种在Linux操作系统中使用Shell脚本语言编写脚本的技术。
通过Shell编程,我们可以自动化执行一系列的命令,提高工作效率。
下面,我将介绍一个实际的Shell编程案例,帮助大家更好地理解和应用Shell编程。
案例背景:假设我们是一家电商公司的运维工程师,每天需要备份公司的数据库,并将备份文件上传到远程服务器上。
为了简化这个繁琐的过程,我们可以使用Shell编程来实现自动备份和上传。
案例步骤:1. 创建Shell脚本文件首先,我们需要创建一个Shell脚本文件,比如命名为backup.sh。
可以使用任何文本编辑器来创建该文件。
2. 编写脚本内容在backup.sh文件中,我们需要编写一系列的命令来实现备份和上传的功能。
下面是一个简单的示例:```shell#!/bin/bash# 定义备份文件名和路径backup_file="db_backup_$(date +%Y%m%d).sql"backup_path="/path/to/backup"# 备份数据库mysqldump -u username -p password database >$backup_path/$backup_file# 上传备份文件到远程服务器scp $backup_path/$backup_file user@remote_server:/path/to/backup```在这个示例中,我们首先定义了备份文件的名称和路径。
然后,使用`mysqldump`命令备份数据库,并将备份文件保存到指定的路径中。
最后,使用`scp`命令将备份文件上传到远程服务器上。
3. 添加执行权限在终端中,使用`chmod +x backup.sh`命令为脚本文件添加执行权限。
4. 执行脚本在终端中,使用`./backup.sh`命令执行脚本。
18个LinuxShell脚本经典案例课件PPT模板
05
1-11案例10:一键部署LNMP网站平台案例10: 一键部署LNMP网站平台
06
1-12案例11:监控MySQL主从状态是否异常案 例11:监控MySQL主从状态是否异常
第1章18个生产环境linuxshell脚 本案例
01
1-13案例12:MySQL数据库备份(分库分表) 案例12:MySQL数据库备份(分库分表)
06
1-18案例17:DOS攻击防范案例17:DOS攻击 防范
第1章18个生产环境 linuxshell脚本案例
1-19案例18:目录文件变化监 控与实时文件同步案例18:目录 文件变化监控与实时文件同步
1-20小结小结
感谢聆听
02
1-14案例13:Nginx访问日志分析案例13: Nginx访问日志分析
03
1-15案例14:Nginx访问日志自动按天切割案 例14:Nginx访问日志自动按天切割
04
1-16案例15:自动发布Java项目(Tomcat)案 例15:自动发布Java项目(Tomcat)
05
1-17案例16:自动发布PHP项目案例16:自动 发布PHP项目
03
1-3案例2:Linux系统发送告警邮件案例2: Linux系统发送告警邮件
04
1-4案例3:批量创建100个用户并设置随机密码 案例3:批量创建100个用户并设置随机密码
05
1-5案例4:一键查看服务器资源利用率案例4: 一键查看服务器资源利用率
06
1-6案例5:找出占用CPU、内存过高的进程案 例5:找出占用CPU、内存过高的进程
18个linuxshell脚本 经典案例
演讲人
2 0 2 x - 11 - 11
linux的基本操作(编写shell脚本)
linux的基本操作(编写shell脚本)终于到shell 脚本这章了,在以前笔者卖了好多关⼦说shell脚本怎么怎么重要,确实shell脚本在linux系统管理员的运维⼯作中⾮常⾮常重要。
下⾯笔者就带你正式进⼊shell脚本的世界吧。
到现在为⽌,你明⽩什么是shell脚本吗?如果明⽩最好了,不明⽩也没有关系,相信随着学习的深⼊你就会越来越了解到底什么是shell脚本。
⾸先它是⼀个脚本,并不能作为正式的编程语⾔。
因为是跑在linux的shell中,所以叫shell脚本。
说⽩了,shell脚本就是⼀些命令的集合。
举个例⼦,我想实现这样的操作:1)进⼊到/tmp/⽬录;2)列出当前⽬录中所有的⽂件名;3)把所有当前的⽂件拷贝到/root/⽬录下;4)删除当前⽬录下所有的⽂件。
简单的4步在shell窗⼝中需要你敲4次命令,按4次回车。
这样是不是很⿇烦?当然这4步操作⾮常简单,如果是更加复杂的命令设置需要⼏⼗次操作呢?那样的话⼀次⼀次敲键盘会很⿇烦。
所以不妨把所有的操作都记录到⼀个⽂档中,然后去调⽤⽂档中的命令,这样⼀步操作就可以完成。
其实这个⽂档呢就是shell脚本了,只是这个shell脚本有它特殊的格式。
Shell脚本能帮助我们很⽅便的去管理服务器,因为我们可以指定⼀个任务计划定时去执⾏某⼀个shell脚本实现我们想要需求。
这对于linux 系统管理员来说是⼀件⾮常值得⾃豪的事情。
现在的139邮箱很好⽤,发邮件的同时还可以发⼀条邮件通知的短信给⽤户,利⽤这点,我们就可以在我们的linux服务器上部署监控的shell脚本,⽐如⽹卡流量有异常了或者服务器web服务器停⽌了就可以发⼀封邮件给管理员,同时发送给管理员⼀个报警短信这样可以让我们及时的知道服务器出问题了。
有⼀个问题需要约定⼀下,凡是⾃定义的脚本建议放到/usr/local/sbin/⽬录下,这样做的⽬的是,⼀来可以更好的管理⽂档;⼆来以后接管你的管理员都知道⾃定义脚本放在哪⾥,⽅便维护。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【例子:001】判断输入为数字,字符或其他1.#!/bin/bash2.read -p "Enter a number or string here:" input3.case $input in4. [0-9]) echo -e "Good job, Your input is a numberic! \n" ;;5.[a-zA-Z]) echo -e "Good job, Your input is a character! \n" ;;6. *) echo -e "Your input is wrong, input again! \n" ;;7.esac【例子:002】求平均数1.#!/bin/bash2.# Calculate the average of a series of numbers.3.SCORE="0"4.AVERAGE="0"5.SUM="0"6.NUM="0"7.while true; do8. echo -n "Enter your score [0-100%] ('q' for quit): "; read SCORE;9. if (("$SCORE" < "0")) || (("$SCORE" > "100")); then10. echo "Be serious. Common, try again: "11. elif [ "$SCORE" == "q" ]; then12. echo "Average rating: $AVERAGE%."13. break14. else15. SUM=$[$SUM + $SCORE]16. NUM=$[$NUM + 1]17. AVERAGE=$[$SUM / $NUM]18. fi19.done20.echo "Exiting."【例子:003】自减输出1.[scriptname: doit.sh]2.while (( $# > 0 ))3.do4. echo $*5. shift6.done7./> ./doit.sh a b c d e8. a b c d e9. b c d e10.c d e11.d e12.e【例子:004】在文件中添加前缀1.# 人名列表2.# cat namelist3.Jame4.Bob5.Tom6.Jerry7.Sherry8.Alice9.John10.# 脚本程序11.# cat namelist.sh12.#!/bin/bash13.for name in $(cat namelist)14.do15. echo "name= " $name16.done17.echo "The name is out of namelist file"18.# 输出结果19.# ./namelist.sh= Jame= Bob= Tom= Jerry= Sherry= Alice= John【例子:005】批量测试文件是否存在1.[root@host ~]# cat testfile.sh2.#!/bin/bash3.for file in test*.sh4.do5. if [ -f $file ];then6. echo "$file existed."7. fi8.done9.[root@host ~]# ./testfile.sh10.test.sh existed.11.test1.sh existed.12.test2.sh existed.13.test3.sh existed.14.test4.sh existed.15.test5.sh existed.16.test78.sh existed.17.test_dev_null.sh existed.18.testfile.sh existed.【例子:005】用指定大小文件填充硬盘1.[root@host ~]# df -ih /tmp2.Filesystem Inodes IUsed IFree IUse% Mounted on3./dev/mapper/vg00-lvol54. 1000K 3.8K 997K 1% /tmp5.[root@host ~]# cat cover_disk.sh6.#!/bin/env bash7.counter=08.max=38009.remainder=010.while true11.do12. ((counter=counter+1))13. if [ ${#counter} -gt $max ];then14. break15. fi16. ((remainder=counter%1000))17. if [ $remainder -eq 0 ];then18. echo -e "counter=$counter\tdate=" $(date)19. fi20. mkdir -p /tmp/temp21. cat < testfile > "/tmp/temp/myfile.$counter"22. if [ $? -ne 0 ];then23. echo "Failed to write file to Disk."24. exit 125. fi26.done27.echo "Done!"28.[root@host ~]# ./cover_disk.sh29.counter=1000 date= Wed Sep 10 09:20:39 HKT 201430.counter=2000 date= Wed Sep 10 09:20:48 HKT 201431.counter=3000 date= Wed Sep 10 09:20:56 HKT 201432.cat: write error: No space left on device33.Failed to write file to Disk.34.dd if=/dev/zero of=testfile bs=1M count=1【例子:006】通过遍历的方法读取配置文件1.[root@host ~]# cat hosts.allow2.127.0.0.13.127.0.0.24.127.0.0.35.127.0.0.46.127.0.0.57.127.0.0.68.127.0.0.79.127.0.0.810.127.0.0.911.[root@host ~]# cat readlines.sh12.#!/bin/env bash13.i=014.while read LINE;do15. hosts_allow[$i]=$LINE16. ((i++))17.done < hosts.allow18.for ((i=1;i<=${#hosts_allow[@]};i++)); do19. echo ${hosts_allow[$i]}20.done21.echo "Done"22.[root@host ~]# ./readlines.sh23.127.0.0.224.127.0.0.325.127.0.0.426.127.0.0.527.127.0.0.628.127.0.0.729.127.0.0.830.127.0.0.931.Done【例子:007】简单正则表达式应用1.[root@host ~]# cat regex.sh2.#!/bin/env sh3.#Filename: regex.sh4.regex="[A-Za-z0-9]{6}"5.if [[ $1 =~ $regex ]]6.then7. num=$18. echo $num9.else10. echo "Invalid entry"11. exit 112.fi13.[root@host ~]# ./regex.sh 123abc14.123abc15.#!/bin/env bash16.#Filename: validint.sh17.validint(){18. ret=`echo $1 | awk '{start = match($1,/^-?[0-9]+$/);if (start == 0) print "1";else print "0"}'`19. return $ret20.}21.validint $122.if [ $? -ne 0 ]; then23. echo "Wrong Entry"24. exit 125.else26. echo "OK! Input number is:" $127.fi【例子:008】简单的按日期备份文件1.#!/bin/bash2.NOW=$(date +"%m-%d-%Y") # 当前日期3.FILE="backup.$NOW.tar.gz" # 备份文件4.echo "Backing up data to /tmp/backup.$NOW.tar.gz file, please wait..." #打印信息5.tar xcvf /tmp/backup.$NOW.tar.gz /home/ /etc/ /var # 同时备份多个文件到指定的tar压缩文件中6.echo "Done..."【例子:009】交互式环境select的使用1.#!/bin/bash2.echo "What is your favorite OS?"3.select OS in "Windows" "Linux/Unix" "Mac OS" "Other"4.do5. break6.done7.echo "You have selected $OS"8.root@localhost:~/training# ./select.sh9.What is your favorite OS?10.1) Windows11.2) Linux/Unix12.3) Mac OS13.4) Other14.#? 115.You have selected Windows【例子:010】批量修改文件名的脚本1.#!/bin/bash2.# we have less than 3 arguments. Print the help text:3.if [ $# -lt 3 ]; then4. cat <<-EOF5. ren -- renames a number of files using sed regular expressions6. USAGE: ren.sh 'regexp' 'replacement' files7. EXAMPLE: rename all *.HTM files in *.html:8. ren 'HTM$' 'html' *.HTM9. EOF10. exit 011.fi12.OLD="$1"13.NEW="$2"14.# The shift command removes one argument from the list of15.# command line arguments.16.shift17.shift18.# $* contains now all the files:19.for file in $*20.do21.if [ -f "$file" ]; then22. newfile=`echo "$file" | sed "s/${OLD}/${NEW}/g"`23. if [ -f "$newfile" ]; then24. echo "ERROR: $newfile exists already"25. else26. echo "renaming $file to $newfile "27. mv "$file" "$newfile"28. fi29.fi30.done31.root@localhost:~/training# ./ren.sh "HTML$" "html" file*.HTML32.renaming file10.HTML to file10.html33.renaming file1.HTML to file1.html34.renaming file2.HTML to file2.html35.renaming file3.HTML to file3.html36.renaming file4.HTML to file4.html37.renaming file5.HTML to file5.html38.renaming file6.HTML to file6.html39.renaming file7.HTML to file7.html40.renaming file8.HTML to file8.html41.renaming file9.HTML to file9.html【例子:011】break语句在脚本中的应用示例1.#!/bin/bash2.for VAR1 in 1 2 33.do4. for VAR2 in 0 55. do6. if [ $VAR1 -eq 2 -a $VAR2 -eq 0 ]7. then8. break 2 # 退出第二重循环,亦即退出整个循环9. else10. echo "第一个变量:$VAR1 第二个变量:$VAR2"11. fi12. done13.done14.root@localhost:~/training# ./test.sh15.第一个变量:1 第二个变量:016.第一个变量:1 第二个变量:5【例子:012】/dev/tty在读取人工输入中的特殊作用1.#!/bin/bash2.# 用来验证两次输入的密码是否一致3.printf "Enter your passwd: " # 提示输入4.stty -echo # 关闭自动打印输入字符的功能5.read pwd1 < /dev/tty # 读取密码6.printf "\nEnter again: " # 再次提示输入7.read pwd2 < /dev/tty # 再读取一次以确认8.stty echo # 打开自动打印输入字符的功能9.if [[ "$pwd1" == "$pwd2" ]]; then # 对两次输入的密码进行判断10. echo -e "\nPASSWORD: the same"11.else12. echo -e "\nPASSWORD: not same"13.fi14.root@localhost:~/training# ./test.sh15.Enter your passwd:16.Enter again:17.PASSWORD: the same【例子:013】/dev/null在脚本中的简单示例1.#!/bin/bash2.if grep /bin/bash $0 > /dev/null 2>&1 # 只关心命令的退出状态而不管其输出3.then # 对退出状态进行判断4. echo -e "/bin/bash in $0\n"5.else6. echo -e "/bin/bash not in $0\n"7.fi8.脚本输出:9.root@localhost:~/training# ./test.sh10./bin/bash in ./test.sh【例子:014】构建自己的bin目录存放执行脚本,然后随便执行的简单示例1.$ cd # 进入家目录2.$ mkdir bin # 创建$HOME目录下自己的bin目录3.$ mv test.sh bin # 将我们自己的脚本放到创建的bin目录下4.$ PATH=$PATH:$HOME/bin # 将个人的bin目录放到PATH中5.$ test.sh # 现在就可以直接执行自己的脚本了【例子:015】将长句子中单词长度为5及以上的单词打印出来1.#!/bin/bash2.# filename: test.sh3.sentence="When you're attracted to someone it just means that your subconscious is attracted to their subconscious, subconsciously.4.So what we think of as fate, is just two neuroses knowing they're a perfect match."5.for word in ${sentence}6.do7. new=`echo $word | tr -cd '[a-zA-Z]'` # 去除句子中的,或者'8. len=${#new} # 求长度9. if [ "$len" -ge 5 ] # 再判断10. then11. echo $new12. fi13.done14.root@localhost:~# ./test.sh15.youre16.attracted17.someone18.means19.subconscious20.attracted21.their22.subconscious23.subconsciously24.think25.neuroses26.knowing27.theyre28.perfect29.match【例子:016】根据输入的数据(年4位,月2位),来判断上个月天数1.#!/bin/bash2.get_last_day()3.{4. year=`expr substr $1 1 4`5. month=`expr substr $1 5 2`6. curr_month=`echo $month | tr -d '0'` # 去掉里面的0,方便后面计算7. echo "curr_month=$curr_month"8. last_month=`expr $curr_month - 1`9. case $last_month in10. 01|03|05|07|08|10|12|0)11. echo "上个月天数-->" 31 ;;12. 02)13. if [ `expr $year % 400` = 0 ] ; then14. echo "上个月天数-->" 2915. elif [ `expr $year % 4` = 0 ] && [ `expr $year % 100` != 0 ] ; then16. echo "上个月天数-->" 2917. else18. echo "上个月天数-->" 2819. fi ;;20. *)21. echo "上个月天数-->" 3022. esac23.}24.if [ $# -ne 1 ]; then25. echo "Usage: $0 201608"26.else27. get_last_day $128.fi29.root@localhost:~/training# ./test.sh 20160130.上个月天数--> 31【例子:017】统计文件中每个单词出现的频率1.#!/bin/sh2.# 从标准输入读取文件流,再输出出现频率的前n,默认:25个单词的列表3.# 附上出现频率的计数,按照这个计数由大到小排列4.# 输出到标准输出5.# 语法: wf [n]6.tr -cs A-Za-z\' '\n' |7. tr A-Z a-z |8. sort |9. uniq -c |10. sort -k1,1nr -k2 |11. sed ${1:-25}q12.root@localhost:~/training# wf 10 < /etc/hosts | pr -c4 -t -w8013. 6 ip 1 1 archive 1 capable14. 3 ff 1 allnodes 1 are 1 cn15. 2 localhost 1 allrouters【例子:018】使用while和break等待用户登录1.#!/bin/bash2.# 等待特定用户登录,每30秒确认一次3.# filename: wait_for_user_login.sh4.read -p "Ener username:-> " user5.while true6.do7. if who | grep "$user" > /dev/null8. then9. echo "The $user now logged in."10. break11. else12. sleep 3013. fi14.done15.root@localhost:~/shell# ./wait_for_user_login.sh16.Ener username:-> guest17.The guest now logged in.【例子:019】结合while,case,break,shift做简单的选项处理1.#!/bin/bash2.# 将标志变量设置为空值3.file= verbose= quiet= long=4.while [ $# -gt 0 ] # 执行循环直到没有参数为止5.do6. case $1 in # 检查第一个参数7. -f) file=$28. shift ;; # 移位-f,使得结尾shift得到$2的值9. -v) verbose=true10. quiet= ;;11. -q) quiet=true12. verbose= ;;13. -l) long=true ;;14. --) shift15. break ;;16. -*) echo "$0: $1: unrecongnized option >&2" ;;17. *) break ;;18. esac19.done20.~【例子:020】read读取多个变量处理,及文本遍历的两种常用方式1.#!/bin/bash2.while IFS=: read user pwd pid gid fullname homedir shell # IFS作为列之间的分隔符号,read读取多个变量3.do4. printf "The user=%s homedir=%s\n" "$user" "$homedir" # 对文本中的行进行处理5.done < /etc/passwd # 读取文件6.# 第二种方式7.#!/bin/bash8.cat /etc/passwd |9. while IFS=: read user pwd pid gid fullname homedir shell10.do11. printf "The user=%s homedir=%s\n" "$user" "$homedir"12.done【例子:021】复制目录树的两个简单脚本1.#!/bin/bash2.# 方式一3.find /root/shell -type d -print | # 寻找所有目录4. sed 's;/root/shell/;/tmp/shell/;' | # 更改名称,使用;作为定界符5. sed 's/^/mkdir -p /' | # 插入mkdir -p 命令6. sh -x # 以Shell的跟踪模式执行7.# 方式二8.find /root/shell -type d -print | # 寻找所有目录9. sed 's;/root/shell/;/tmp/shell/;' | # 更改名称,使用;作为定界符10. while read newdir # 读取新的目录名11. do12. mkdir -p $newdir13. done14.~【例子:022】发邮件给系统前10名磁盘用户,要求清理磁盘空间1.#!/bin/bash2.cd /home # 移动到目录的顶端3.du -s * | # 产生原始磁盘用量4. sort -nr | # 以数字排序,最高的在第一位5. sed 10q | # 在前10行之后就停止6. while read amount name # 将读取的数据分别作为amount, name变量7. do8. mail -s "disk usage warning" $name << EOF9.Gretings. You are one of the top 10 consumers of disk space10.on the system. Your home directory users $amount disk blocks.11.Please clean up unneeded files, as soon as possible.12.Thanks,13.Your friendly neighborhood system administrator.14.EOF15. done【例子:023】将密码文件转换为Shell邮寄列表1.#!/bin/bash2.# passwd-to-mailing-list3.#4.# 产生使用特定shell的所有用户邮寄列表5.#6.# 语法: passwd-to-mailing-list < /etc/passwd7.# 删除临时性文件8.rm -rf /tmp/*.mailing-list9.# 从标准输入中读取10.while IFS=: read user passwd uid gid name home Shell11.do12. Shell=${Shell:-/bin/sh} # 如为空shell,指/bin/sh13. file="/tmp/$(echo $Shell | sed -e 's;^/;;' -e 's;/;-;g').mailing-list"14. echo $user, >> $file15.done16.root@localhost:~# vim passwd-to-mailing-list17.root@localhost:~# passwd-to-mailing-list < /etc/passwd18.root@localhost:~# cat /tmp/bin-bash.mailing-list19.root,20.test,er,22.root@localhost:~# cat /tmp/bin-sh.mailing-list23.libuuid,24.jerry,【例子:024】变更目录时更新PS11.#!/bin/bash2.cd()3.{4. command cd "$@" # 实际改变目录5. x=$(pwd) # 取得当前目录的名称,传递给变量6. PS1="${x##*/}\$ " # 截断前面的组成部分,指定给PS17.}8.root$ # 最后输出,类似于这种,看不到目录的完整路径【例子:025】根据XML文件中的license时间来判断是否过期1.2.3.中国,福建,福州市,鼓楼区4. 1231235. hdsas_base_3.0.0.2_16Q2_RC26. _RC257971fe611f07. f04c3d1eb4bf61138. 2016-08-02 16:46:399. 30 days10.11.获得2016-08-02 16:46:39时间加上30 days12.期限,得到时间减去系统当前时间,小于7天,显示license即将在几天后过期。