第三季-第27课-Shell脚本高级编程
第27课-Shell脚本高级编程
28.1 什么是脚本
脚本是一个包含一系列命令序列的文本文件(可以通过编辑器进行编辑,而且可以执行)。当运行这个脚本文件时,文件中包含的命令序列将得到自动执行。例如我们创建7个文件,可以不断的创建7个文件,也可以通过一个脚本文件(.sh文件)来创建。
28.2 脚本编程技术
1. 基本结构
(1)解析器:#!后面的部分,表示该脚本用哪个解析器来操作;
(2)命令序列:由众多的命令组成。
2. 变量
shell脚本允许用户设置和使用自己的变量,变量可以使数字或者字符串,用户无需指定其类型,也无需在使用前定义。赋值号的左右两边不用空格,注释用#开头。
#!/bin/sh
a=”hello world”
b=5
echo “A is: $a”
echo “B is %b”
注:在运行该程序之前我们会发现有错,是因为我们使用的是windows下的文件和linux下的文件不同。所以,我们通过dos2unix shell.sh进行转换。我们在转换之前要安装相应的rpm包。
3. 参数
同C程序一样,shell脚本中可以使用命令行参数
$#:传入脚本的命令行参数个数
$*:所有命令行参数值,在各个参数值之间留有空格
$0:命令本身(shell本身)
$1:第一个命令行参数
$2:第二个命令行参数
例如:
#2.3
echo "number of var:" $#
echo "value of vars" $*
echo "name of script" $0
echo "value of var1" $1
echo "value of var2" $2
我们输入命令./shell.sh a 3后,显示的是
number of var:2
value of vars a 3
name of script ./shell.sh
value of var1 a
value of var2 3
4. 数字计算
shell脚本提供了一个专门的命令expr来计算数学表达式,例如expre 5 + 1,但是当要把计算的结果复制给其他变量的时候,还必须使用反引号。~线下面的符号就是`
var = `expr 20/10`
例如:
#2.4
var1=10
var2=20
var3=`expr $var1 / $var2`
var4=`expr $var1 + $var2`
echo $var3
echo $var4
运行结果:0
30
5. 流程控制
(1)shell脚本中最基本的流程控制语句就是if-then,使用格式:
if[ condition ](特别提醒:方括号左右两边必须有空格)
then
commands
else
commands
fi
l 条件比较
比较操作 |
整数操作 |
字符串操作 |
相同 |
-eq |
= |
不同 |
-ne |
!= |
大于 |
-gt |
> |
小于 |
-lt |
< |
大于或等于 |
-ge |
|
小于或等于 |
-le |
|
为空 |
-z |
|
不为空 |
-n |
例:
比较整数a和b是否相等:if [ $a = $b](也可用eq)
判断整数a是否大于整数b:if [ $a -gt $b]
比较字符串a和b是否相等:if [ $a = $b]
判断字符串a是否为空:if [ -z $a]
判断整数变量a是否大于b:if [ $a -gt $b]
注意:
l 在括号的左右都留有空格
l “=”左右都有空格
针对文件目录的
-e 文件已经存在
-f 文件是普通文件
-s 文件大小不为零
-d 文件是一个目录
-r 文件对当前用户可以读取
-w 文件对当前用户可以写入
-x 文件对当前用户可以执行
#!/bin/sh
folder=/home
[ -r “$folder” ] && echo “Can read $folder” 当前面条件为真的时候执行后面的操作
[ -f “$folder” ] || echo “this is not file” 当前面的条件为假的时候执行后面的操作
例:
var=10
if [ $var -gt 5 ]
then
echo "the value is qreater then 5"
fi
运行结果:the value is qreater then 5
(2)for语句
shell脚本提供了for语句,用于创建类似于c语言编程中for语句一样的循环。使用格式:
for var in list
do
commands
done
例:
#!/bin/bash
list="Sun Mon Tue Wed Thur Fri Sat"
for day in $list
do
echo $day
done
运行结果:
Sun
Mon
Tue
Wed
Thur
Fri
Sat
(3)while语句
shell脚本提供了while语句,用于创建类似于c语言编程中while语句一样的循环。使用格式:
while condition
do
commands
done
例:
#!/bin/bash
var=5
while [ $var -gt 0 ]
do
echo $var
var=`expr $var - 1`
done
运行结果:
5
4
3
2
1
6. sed编辑器
Sed(Stream Editior):流式编辑器又名行(hang)编辑器,每次只编辑一行,格式如下:
sed [操作选项] ‘命令’ 文件名
常用操作选项:
-n:指定处理后只显示该行
-e:进行多项编辑任务
-i:直接修改读取的文件内容,而不是由屏幕输出
l 常用命令选项:
p 打印匹配行
a 新增
c 替代一行
d 删除定位行
s 代替一行中的某些部分
l sed范例
这些修改除了加-i都是对原文件没有影响的。
(1)显示
sed -n ‘2p’ tmp.txt 只显示第2行
sed -n ‘1,3p’ tmp.txt 打印第1行到第3行-F
sed -n ‘/mov/’p tmp.txt 打印含movie的行
(2)删除
sed ‘2d’ tmp.txt 删除第2行(会打印出来剩下的部分)
sed ‘3,$d’ tmp.txt 删除第3行到最后一行,$:最后一行
(3)查询
sed -n ‘/hello/p’ tmp.txt 查询包括关键字hello的所有行
(4)代替
sed ‘1c Hi’ tmp.txt 第1行代替为Hi
sed -n ‘/hello/p’ tmp.txt |sed ‘sed ‘s/hello/bird/g’
(5)插入
sed -i ‘$a bye’ tmp.txt 在最后一行插入bye
7. awk分析器
awk是一个强大的文本分析工具,它把文件逐行的读入,以空格为默认分隔符将每行分割为多个字段。
使用方式:awk ‘{pattern + action}' filenames
pattern 要查找的内容
action 找到匹配内容时所执行的命令
范例:
last -n 5|awk ‘{print $1}’ last -n 5表示最近登陆的5个用户。
cat /etc/passwd | awk -F ‘:’ ‘{print $1}’ -F表示指定分隔符
awk –F ‘:’ ‘$1==”root” {print $0}’ /etc/passwd
28.3 综合实例
qcd分析
qcd.sh
qcd ()
{
mkdir -p /.qcd/tmp
[ -x /.qcd/tmp/qcd_tmp ] || touch /.qcd/tmp/qcd_tmp
chmod 700 /.qcd/tmp
QD=/.qcd/tmp/qcd_tmp
export QD
/usr/local/sbin/qcde "$@"
[ ! `cat $QD` ] || cd "`cat $QD`"
rm -f "$QD"
unset QD;
}
install
#!/bin/sh
#qcd install
#written by xiewei 2004
setup_content=/etc/qcd
history_dir=$setup_content/history_dir
bin_content=/usr/local/sbin
prof_content=/etc/profile.d
setup()
{
#check
if [ -r $history_dir ] #如果$history_dir 对当前用户可读
then
echo -n "You have installed qcd , overwrite it(y\Y or q\Q or n\N)? "
while read choice
do
if [ "$choice" = "y" -o "$choice" = "Y" ] #要改写安装路径
then
break
fi
if [ "$choice" = "q" -o "$choice" = "Q" ] #什么也不做退出
then
echo "Nothing to do!"
exit 1
fi
if [ "$choice" = "n" -o "$choice" = "N" ] #安装到默认的位置
then
cp -f ./qcd $bin_content/
cp -f ./qcd.sh $prof_content/
echo "install qcd OK, but do not overwrite it!"
echo "version is 1.00"
exit 1
fi
echo -n "You have installed qcd, overwrite it(y\Y or q\Q or n\N)? "
done
fi
if [ -r $setup_content ]
then
:
else
mkdir $setup_content
fi
cp -f ./qcde $bin_content/
cp -f ./history_dir $setup_content/
cp -f ./qcd.sh $prof_content/
}
delete()
{
[ -r $history_dir ] || [ -r $bin_content ] || \
! echo "Your computer has not qcd!" || ! echo "Nothing to do!"
echo -n "Are you sure to delete qcd(y\Y or q\Q)? "
while read choice
do
if [ "$choice" = "y" -o "$choice" = "Y" ]
then
break
fi
if [ "$choice" = "q" -o "$choice" = "Q" ]
then
echo "Nothing to do!"
exit 1
fi
echo -n "Are you sure to delete qcd(y\Y or q\Q)? "
done
rm -rf $setup_content
rm -f $bin_content/qcd
rm -f $prof_content/qcd.sh
}
usage()
{
echo "<install> install qcd on your computer."
echo "<install del> delete qcd from your computer."
exit 1
}
echo "Qcd Install Software"
echo "Written By XieWei 2004"
if [ $# -eq 0 ] #如果传入的参数个数为0?then
setup
echo "install qcd OK!"
echo "version is 1.00"
exit 1
fi
if [ $# -gt 1 ] #如果传入的参数个数大于0
then
usage
fi
case $1 in #如果传入的第一个参数是del
del)
delete
echo "have delete qcd OK!"
;;
*)
usage #提示信息
;;
esac
转载于:https://www.cnblogs.com/free-1122/p/11360182.html
第三季-第27课-Shell脚本高级编程相关推荐
- 第七课 Shell脚本编程-大型脚本工具开发实战
第七课 Shell脚本编程-大型脚本工具开发实战 文章目录 第七课 Shell脚本编程-大型脚本工具开发实战 第一节 需求描述 第二节 脚本的特殊参数 第三节 功能函数的实现 第四节 程序主流程设计及 ...
- 视频教程-Kali Linux渗透测试全程课与脚本语言编程系列课程-渗透测试
Kali Linux渗透测试全程课与脚本语言编程系列课程 本人有多年的服务器高级运维与开发经验,擅长计算机与服务器攻防及网络攻防技术!对网络安全领域有持续的关注和研究! 林晓炜 ¥899.00 立即订 ...
- linux 脚本编写 -eq,关于shell脚本基础编程第四篇
shell脚本基础编程第四篇 本章主要内容:函数 函数 function: function 名称 { 命令 ; } 或 name () { 命令 ; } 定义 shell 函数. 创建一个以 NAM ...
- 标杆徐linux云计算视频,标杆徐2018 Linux自动化运维系列④: Shell脚本自动化编程实战...
2019年录制SHell新课地址 贴切企业脚本编写思路讲解,带你玩Shell脚本编程实战. 本套课程从实际项目案例出发,近100个Shell实例讲解,由浅入深,循序渐进,带你玩转Shell编程的方方面 ...
- linux Shell(脚本)编程入门实例讲解详解
linux Shell(脚本)编程入门实例讲解详解 为什么要进行shell编程 在Linux系统中,虽然有各种各样的图形化接口工具,但是sell仍然是一个非常灵活的工具.Shell不仅仅是命令的收集, ...
- shell脚本编程for循环求阶乘_shell脚本编程(完结版).pdf
shell脚本编程(完结版) Shell 脚本编程学习笔记 2013 年 5 月 2 日 追风~忆梦 如有任何疑问,请联系作者,作者 QQ:1028150787,或者到韦东山群共同讨论 1 Shell ...
- Linux下eclipse中shell脚本编程环境的搭建
注意:本文所用到的linux发行版是fedora 15.如果用fedora 15以上的版本可能会有问题.至于解决方案或者是搭建方法我会尽量抽出时间写一篇新的博客... 本文主要是介绍在linux平台下 ...
- Linux Shell 脚本知识点
正则表达式在线生成工具: http://tools.jb51.net/regex/create_reg 0. shell 调试 复制代码 代码如下: sh -x somefile.sh 在somefi ...
- Linux 下Shell脚本中的加减乘除运算
在用shell脚本语言编程的时候,我们经常用到加减乘除等基本的数学运算操作,现在整理一下,放在这里,以备后用. Shell中常用的数学运算符有一下几个: +:对两个变量做加法.-:对两个变量做减法.* ...
- 70个经典的 Shell 脚本面试问题
转载自:http://www.imooc.com/article/1131 1) 如何向脚本传递参数 ? ./script argument 例子: 显示文件名称脚本 ./show.sh file1. ...
最新文章
- IIS7、IIS8添加net.tcp协议报错 未将对象引用设置到对象的实例。
- java dll is多线程_Java实现多线程--四种方法
- plt title设置在下方_Python数据分析:可视化图表注释设置
- python升级pip怎么出错了_Python,开启吐槽模式,新手必看!
- android开发期间使用真机调试但系统无法识别出真机
- 一文掌握开发利器:正则表达式
- linux驱动导出文件属性,将Linux配置文件和设置备份到USB闪存驱动器的方法
- HTML中的Content-Type的类型
- Net Core下多种ORM框架特性及性能对比
- 【bfs】WJ的逃离
- [渝粤教育] 西南科技大学 高级语言程序设计(Java) 在线考试复习资料
- 更改数据库管理员sa账户密码
- 简述Java三大特性
- GeoServer发布Shapefile矢量数据
- 收藏!数据分析、人工智能、产品经理等6个方向学习路线图及参考书目
- 苏州新导RFID智能医药柜,为老人用药,取药吃药带来了方便
- 软件测试过程与方法_第1单元
- [Maven实战-许晓斌]-[第二章]-2.2基于UNIX系统安装maven
- vmware虚拟机序列号
- 国内FRM证书福利政策大全
热门文章
- Hibernate-03-Hibernate的检索方式
- Android 代码关于重构的一点体会
- 一个精仿今日头条项目
- Windows下编译FFmpeg
- 插件开发之360 DroidPlugin源码分析(一)初识
- 为什么很多类甚者底层源码要implements Serializable ?
- python时间处理方法_基于python时间处理方法(详解)
- python中列表去重有哪几种方法_python列表里的字典元素去重
- win10删除开机密码_教你电脑如何设置开机密码_win10教程
- 1.GNUradio 的环境搭建