Linux之Shell编程学习总结
目录
一、简介
二、shell编程
三、总结
一、简介
shell 是指一种应用程序,提供了一个界面,用户通过这个界面访问操作系统内核的服务。将多个shell命令按语法组合在一起,并保存在文本文件中即得到我们所说的shell脚本。shell脚本可以方便地与系统交互,完成系统管理以及批处理任务。shell处于操作系统与应用之间,起到桥梁的作用。shell 编程,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。本文将总结shell编程的一些语法,如循环控制、条件控制、环境变量、自定义变量等等相关的内容。
二、shell编程
【a】shell脚本编程格式要求
- 脚本必须以#!/bin/bash开头,用于指明执行该脚本的解释器;
- 脚本需要有可执行权限x(通过chmod命令可以为shell脚本赋予可执行权限);
- 脚本自定义变量的时候,尽量都是用大写字母;
- shell脚本尽量以.sh为后缀,
【b】shell脚本入门
vim test01.sh
#!/bin/bash
echo "hello shell script!"
chmod 744 test01.sh
赋予可执行权限:
这就是一个最简单的shell示例,其实在shell脚本里面都是一些Linux命令组成的程序。
【c】执行shell脚本
(1). 绝对路径方式:使用从根目录到当前目录的绝对路径。
(2). 相对路径方式:使用shell脚本相对于当前目录的路径。
【d】shell变量
shell脚本中的变量主要分为有系统变量和自定义变量,系统变量是全局都可以使用的变量,自定义变量是只对当前shell脚本可以使用。
(1). 系统变量:
echo $PATHecho $HOME
(2). 自定义变量:
vim test02.sh#!/bin/bash
NAME=weixiaohuai
echo $NAMEchmod 744 test02.sh
./test02.sh
(3). 撤销变量
注意,只有非静态(readonly修饰)的变量才能被撤销。如下示例:
注意readonly修饰的变量不能被unset, 会报错:unset: HOBBY: cannot unset: readonly variable。
定义变量的一些规则:
- 变量名称可以由字母、 数字和下划线组成, 但是不能以数字开头
- 等号两侧不能有空格
- 变量名称一般习惯为大写
【e】将命令的返回值赋给变量
vim test03.sh
#/bin/bash#/bin/bash
#将ls -l /home命令执行的结果赋值给RES
RES=$(ls -l /home)
echo $RESRES2=`cat /test03.sh`
echo $RES2chmod 744 test03.sh
./test03.sh
- 反引号, 运行里面的命令, 并把结果返回给变量。
- $(xxx)
【f】设置环境变量
Linux中的环境变量定义是需要在/etc/profile文件中,并且需要export出来,定义完环境变量如果需要马上生效的话,需要执行source /etc/profile用于刷新配置文件。
vim /etc/profileNAME=weixiaohuai
export NAMEsource /etc/profile
【g】位置参数变量
当我们执行一个 shell 脚本时, 如果希望获取到命令行的参数信息, 就可以使用到位置参数变量.。
- $n : n为数字, $0 代表命令本身, $1 - $9 代表第一到第九个参数, 十个以上的参数需要用大括号包含, 如${10};
- $* : 表示命令行中所有的参数, $*把所有的参数看成一个整体,如./test04.sh 1 2 3, $*输出为1 2 3这一个整体参数;
- $@: 表示命令行中所有的参数, 不过$@把每个参数区分对待,如./test04.sh 1 2 3, $*输出为1,2, 3这三个参数;
- $#: 表示所有参数的个数;
vim test04.sh#/bin/bash#获取到命令行命令本身
echo "命令行本身: $0"
echo "命令行第一个参数: $1"
echo "命令行第二个参数: $2"
echo "命令行第三个参数: $3"chmod 744 test04.sh./test04.sh 1 2 3
echo "整体命令行参数 : $*"
echo "分开命令行参数: $@"
echo "参数个数: $# "
【h】预定义变量
预定义变量,就是指事先已经定义好的变量, 我们可以直接在 shell 脚本中使用。
- $$ :当前进程的进程号(PID);
- $! : 后台运行的最后一个进程的进程号(PID);
- $? :最后一次执行的命令的返回状态。 如果这个变量的值为 0, 证明上一个命令正确执行; 如果为非 0, 则证明上一个命令执行不正确了;
echo "当前进程的进程号:$$"
echo "后台运行的最后一个进程的进程号:$!"
echo "最后一次执行的命令的返回状态:$?"
【i】shell运算符
(1). 第一种方式:$((运算式)),注意每个子公式计算出来的结果都需要使用()包起来;
(2). 第二种方式:$[运算式];
vim test05.sh#!/bin/bash#$((运算公式))
echo $(((((1+2)*3))*4))#$[运算公式]
echo $[(1+2)*3*4]chmod 744 test05.sh
./test05.sh
【j】条件判断语句
(1). 语法:
[ 条件表达式 ],注意[ ]左右有空格。非空返回 true。
if [ ]; then
echo "非空"
else
echo "空"
fiif [ weixiaohuai ]; then
echo "非空"
else
echo "空"
fi
(2). 常用判断条件
- 两个整数的比较
- = 字符串比较
- -lt 小于
- -le 小于等于
- -eq 等于
- -gt 大于
- -ge 大于等于
- -ne 不等于
- 按照文件权限进行判断
- -r 有读的权限 [ -r 文件 ]
- -w 有写的权限
- -x 有执行的权限
- 按照文件类型进行判断
- -f 文件存在并且是一个常规的文件
- -e 文件存在
- -d 文件存在并是一个目录
if [ weixiaohuai ]; then
echo "非空"
else
echo "空"
fi#判断wsh是否等于wsh
if [ "wsh" = "wsh" ]; then
echo "相等"
else
echo "不相等"
fi#判断10是否大于0
if [ 10 -gt 0 ]; then
echo "大于"
else
echo "小于等于"
fi#判断/home/wsh是否存在并且是目录
if [ -d /home/wsh ]; then
echo "存在并且是一个目录"
else
(3). 示例:通过获取命令行输入的参数,如果输入的参数, 大于等于 90, 则输出 "优秀", 如果大于等于 80,则输出"良好",否则输出"不合格"。
vim test06.sh#!/bin/bash
if [ $1 -gt 90 ]
thenecho "优秀"
elif [ $1 -le 60 ]
thenecho "不合格"
fichmod 744 test06.sh
./test06.sh
【k】case 语句
(1).基础语法
case $变量名 in
"值 1")
如果变量的值等于值 1, 则执行程序 1
;;
"值 2")
如果变量的值等于值 2, 则执行程序 2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值, 则执行此程序
;;
esac
(2).示例:当命令行参数是 male 时, 输出 "男", 是 female 时, 就输出"", 其它情况输出 "保密"。
#/bin/bash
#当命令行参数是 male 时, 输出 "男", 是 female 时, 就输出"", 其它情况输出 "保密"
case $2 in
"male")
echo "男"
;;
"female")
echo "女"
;;
*)
echo "保密"
;;
esac
【m】for循环
(1). 语法:
语法一:
for 变量 in 值 1 值 2 值 3…
do
程序
done语法二:
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
(2). 示例:使用for循环输出命令行输入的参数
#!/bin/bash
for i in $@
doecho "$i"
done
(3).示例:使用for循环计算0....9相加的和
#!/bin/bashSUM=0
for (( i = 0; i < 10; i++ ))
doSUM=$[$SUM+$i]
done
echo "SUM = $SUM"
【n】while循环
(1). 语法:
while [ 条件判断式 ]
do
程序
done
(2). 示例:从命令行输入一个数 n, 统计从 1+..+ n 的值是多少。
#!/bin/bashSUM=0
I=0while [ $I -le $1 ]
doSUM=$[$SUM+$I]I=$[$I+1]
doneecho "SUM = $SUM"
【o】read 读取控制台输入
(1). 语法
read -p xxx PAR
-p xxx: 指定读取值时的提示符;read -t 10 -p xxx PAR
-t 10: 指定读取值时等待的时间10(秒) , 如果没有在指定的时间内输入,那么控制台就停止锁定状态;
参数变量PAR: 指定接收控制台输入的变量名称
(2). 示例
read -p "请输入:" PAR1
echo "你输入了: $PAR1"#读取控制台输入,如果五秒之内没有在控制台输入,那么停止锁定命令行
read -t 5 -p "请输入:" PAR2
echo "你输入了: $PAR2"
-t指定输入的时间:
【p】系统函数
(1). basename :返回完整路径最后 / 的部分, 常用于获取文件名。
(2). dirname:返回完整路径最后 / 的前面的部分, 常用于返回路径部分。
【q】自定义函数
#!/bin/bash
function sum(){val1=$1val2=$2val3=$(($1+$2))echo $val3
}ret_val=$(sum 10 20)
echo $ret_val
注意:必须在调用函数地方之前,事先声明好函数,因为shell脚本是逐行运行。
三、总结
本文通过详细的示例讲解的Linux中的Shell编程关于条件控制、循环控制、自定义函数的使用方法,在实际工作中,用到Shell的地方有很多,比如结合crontab定时任务调度定期备份我们的数据库;定期清理大文件等等,本文是笔者在学习shell编程的一些总结,希望对大家的学习有所帮助。
Linux之Shell编程学习总结相关推荐
- Linux shell编程学习
Linux shell编程学习 shell是一个作为用户与Linux系统间接口的程序,它允许用户向操作系统输入需要执行的命令.这点与Windows的命令提示符类似,但Linux shell的功能更加强 ...
- 《Linux Shell编程学习笔记之一》
<Linux Shell编程学习笔记之一> 前言 由于自己一直在Windows上面编程,用linux用的比较少,学习linux还是本科大二学的一点点知识.因此自己就准备花点时间来熟悉下li ...
- linux shell编程学习——数组使用
linux的shell的编程方面很强大,最近在写脚本的时候,需要用到shell的数组.下面对最近的学习和使用做个简单的总结. 定义 linux的数组分两种,一种是普通的下标数组,一种是关联数组.前者和 ...
- Linux Shell 编程学习笔记(1)
Linux Shell编程学习笔(2015-7-11) 一:Shell程序运行的三种方法 赋予程序文件可执行权限,直接运行 比如:chmod a+x shell.sh 使用命令解释器(即shell ...
- Linux Shell编程学习笔记(4)
Linux Shell编程学习笔记(2015-7-20) 分类:linux shell 今天学习了Linux Shell中的控制结构.其实大多数语言的控制结构这一块都是基本类似的,有了C语言的基础 ...
- Linux Shell编程学习笔记(2)
Linux Shell编程学习笔记(2015-7-12) 分类:linux shell Shell变量 一:关于Shell变量 Shell是一种弱类型的语言,变量存储的一切值都是字符串.Shell ...
- Linux Shell编程学习笔记(3)
Linux Shell编程学习笔记(2015-7-19) 分类:linux shell 一:位置参数和特殊变量 什么是位置参数? 位置参数也叫位置变量,是运行shell脚本程序时,命令行she ...
- SHELL编程学习笔记
SHELL编程学习笔记 本文描述unix shell的各种应用实例,根据查阅资料和自我总结,作为自己今后复习的模板.本文搜集整理常用的shell应用实例,以例子详述unixshell部分命令的使用,着 ...
- 运维 - 第一阶段 - linux与shell编程
linux与shell编程 讲师:墨竹 系统运维与linux 1.系统运维是什么 简单来说运维(Operation and maintenance)是指对公司硬件和软件的维护. 硬件包括:机房.机柜. ...
- Linux之shell编程篇-----Shell 函数和Shell 输入/输出重定向
最近发现了一个挺厉害的人工智能学习网站,内容通俗易懂,风趣幽默,感兴趣的可以点击此链接进行查看:床长人工智能教程 废话不多说,请看正文! Shell 函数 1. 自定义函数 linux she ...
最新文章
- Android13.9.15
- LeetCode 74. Search a 2D Matrix--有序矩阵查找--python,java,c++解法
- MathType的公式Latex到Katex转换程序
- 自学python还是报班-零基础python自学还是报培训班?
- vue 时间插件_Vue3 插件开发详解尝鲜版「值得收藏」
- Jquery有哪些选择器
- HTML 5核心内容
- One order time zone
- 被远程机器长时间无响应 (错误码:[308])_自动折叠式“Rollbot”为完全不受束缚的软机器人铺平了道路...
- 关于DDD中Domain的思考
- 真就卖爆了!两分钟破万台:1999元实在无敌
- 19.复习:一般过去时、过去进行时和过去完成时
- idea增加文件自动添加版本控制
- excel 比对多列数据
- 大数据的“多维度”与“时效性”
- 自己搭建服务器提供IOS IPA包下载
- 用JAVA制作ICQ
- spring--bean后置处理器(BeanPostProcessor)原理解析
- 数学老师必看,教您快速画椭圆
- QStatusBar
热门文章
- take android,Protake
- 二分从查找(2)按条件查找
- linux容器安装crontab
- length与length()
- php 调用dll静态库,vue-cli 2.x 项目优化之引入本地静态库文件
- 区域增长 matlab,图像分割 区域增长
- java传文件到kafka_Java将CSV的数据发送到kafka的示例
- python的符号lt和gt怎么输入_lt;lt;Python基础教程gt;gt;学习笔记 | 第04章 | 字典...
- js设置北京时区_盘一盘 Python 系列特别篇十九之 时区和夏时令
- python函数及方法大全_Python常用方法和技巧汇总