技能篇:shell教程及脚本编写
前言
我们常时不会见到shell脚本,但是需要阅读开发linux脚本时,这又是一项必不可少的技能。本文在于提供基础的shell编程语法和简单的实例,帮助同学快速开发,可当做shell手册使用也非常善
- shell脚本的执行和模块加载
- shell中的变量
- 位置参数和预定义变量
- 表达式的运算命令
- 表达式判断符号及相关操作符
- 跳转条件语句
- shell数组和字典
- shell自定义函数
- shell程序中常用命令
关注公众号,一起交流,微信搜一搜: 潜行前行
shell脚本的执行和模块加载
- shell脚本的执行
bash scriptName或sh scriptName,当脚本文件本身没有执行权限时常使用的方法path/scriptName或./scriptName,在当前路径下执行脚本,需要将脚本文件的权限改为可执行source scriptName或. scriptName,通常是使用source或 "." 读入或加载指定的Shell脚本文件,然后依次执行指定的Shell脚本中的语句
- shell规范
- 一个规范的Shell脚本在第一行会指出由哪个程序(解释器)来执行脚本中的内容,这一行内容Linux bash的编程一般为:#!/bin/bash 或 #! /bin/sh,bash与sh的区别 , sh为bash的软连接
shell 中的变量
- 变量的赋值方法为: 先写变量名称,紧接着是 "=" ,最后是值,中间无任何空格
赋值时使用带引号的作用
- 双引号:允许通过 $ 符号引用其他变量值
- 单引号:禁止引用其他变量值,$ 视为普通字符
- 反引号:命令替换,提取命令执行后的输出结果
- 示例
--- 双引号 ----
server11:~ # A=hello
hello
server11:~ # B="$A lwl"
hello lwl
--- 单引号 ---
server11:~ # B='$A lwl'
$A lwl
---- 反引号 -----
server11:~ # B=`du -sh /etc`
21M /etc # du -sh /etc 的执行结果
位置参数和预定义变量
- 预定义变量
| 符号 | 描述 |
|---|---|
| $# | 位置参数的数量 |
| $* | 所有位置参数的内容 |
| $? | 命令执行后返回的状态,0表示没有错误,非0表示有错误 |
| $$ | 当前进程的进程号 |
| $! | 后台运行的最后一个进程号 |
| $0 | 当前执行的进程名 |
| ${n} | 第 {n} 个位置参数 |
- shell取第一个位置参数替换程序文件中的 $1,第二个替换 $2 , 依次类推。$0 是一个特殊变量,它的内容是当前这个shell程序的文件名
server11:~ # cat test.sh
#! /bin/bash
echo $1
server11:~ # bash test.sh lwl
lwl
表达式的运算命令
- Shell 中常见的算术运算命令
| 运算符 | 描述 |
|---|---|
| (( expresions )) | 用于整数运算的运算命令 |
| let expresions | 类似(()),常用于赋值表达式 |
| expr expresions | 可用于 整数运算,可执行命令 |
| $[ expresions ] | 用于整数运算 |
- 对于(())运算命令,其返回值需要使用$ 修饰,如: i=$(($A+3))
- 示例
server11:~ # A=10
server11:~ # B=$(($A+5))
server11:~ # echo $B
15
表达式判断符号及相关操作符
- 表达式判断符号
| 判断符号 | 描述 |
|---|---|
| test condition | 利用test命令进行条件判断 |
| [ condition ] | 利用中扣号命令进行条件判断 |
| [[ condition ]] | 利用双中扣号命令进行条件判断 |
| (( condition )) | 不能用于字符串比较 |
- 文件判断操作符
| 文件判断操作符 | 描述 |
|---|---|
| -d (directory) | 文件存在且为目录则为真 |
| -f (file) | 文件存在且为文件则为真 |
| -e (exists) | 文件存在则为真 |
| -s (size) | 文件存在且大小不为0则为真 |
| -r (read) | 文件存在且可读则为真 |
| -w (write) | 文件存在且可写则为真 |
| -x (executable) | 文件存在且可执行则为真 |
| -L (link) | 文件存在且为链接文件则为真 |
| f1 -nt f2 ,nt的全拼为newer than | 文件f1比文件f2新则为真 |
| f1 -ot f2 ,ot的全拼为older than | 文件f1比文件f2旧则为真 |
- 字符串判断操作符( == 和 != 两端要有空格, (()) 不能用于字符判断)
| 常用字符串判断操作符 | 描述 |
|---|---|
| -n | 若字符串长度不为0,则为真 |
| -z | 若字符串长度为0,则为真 |
| "str1" == "str2" | 若str1等于str2,则为真 |
| "st1" != "str2" | 若str1不等于str2,则为真 |
- 整数比较操作符
| 在[]以及test中使用的比较符号 | 在(())和[[]]中使用的比较符号 | 描述 |
|---|---|---|
| -eq | == 或 = | 相等(equal) |
| -ne | != | 不相等(not equal) |
| -gt | > | 大于(greater than) |
| -ge | >= | 大于等于(greater equal) |
| -lt | < | 小于(less than) |
| -le | <= | 小于等于(less equal) |
- 逻辑操作符
| 在[]和test中使用的逻辑操作符 | 在[[]]和(())中使用的操作符 | 描述 |
|---|---|---|
| -a | && | and ,与,两端都为真,才为真 |
| -o | || | or ,或, 两端有一个为真,就为真 |
| ! | ! | not ,非, 两端相反,则结果为真 |
- 表达式判断符号 test 、[] 、[[]] 、 (()) 的区别
| 表达式判断符号 | test | [] | [[]] | (()) |
|---|---|---|---|---|
| 边界是否需要空格 | 需要 | 需要 | 需要 | 不需要 |
| 逻辑操作符 | ! 、-a、 -o | ! 、-a、 -o | ! 、&& 、 || | ! 、&& 、 |\ |
| 整数比较操作符 | -eq 、 -gt 、-lt、-ge 、-le | -eq 、 -gt 、-lt、-ge 、-le | -eq 、 -gt 、-lt、-ge 、-le 或 = 、> 、< 、 >= 、 <= | = 、> 、< 、 >= 、 <= |
| 字符串比较操作符 | = 、 == 、!= | = 、 == 、!= | = 、 == 、!= | 不支持 |
| 文件操作 | -d、-f、-e、-r、-s、-w、-x、-L、-nt、-ot | -d、-f、-e、-r、-s、-w、-x、-L、-nt、-ot | -d、-f、-e、-r、-s、-w、-x、-L、-nt、-ot | 不支持 |
| 是否支持通配符匹配 | 不支持 | 不支持 | 支持 | 不支持 |
- 示例
server11:~ # [ 1 == 1 -a 2 == 3 ] && echo true # 2不等于3,因此true没打印出来
server11:~ # [ 1 == 1 -a 2 == 2 ] && echo true
true
跳转条件语句
- if 条件关键字
if 条件判断;then
逻辑代码
else
逻辑代码
fi
-------------------------
server11:~ # choose="lwl"
server11:~ # if [ choose == "lwl" ];then
> echo true
> else
> echo false
> fi;
false
- case 条件语句
case 变量 in
one)
逻辑代码
;;
two)
逻辑代码
;;
*)
逻辑代码
esac
- for 循环语句
for 条件;do
逻辑代码
done
-------------
server11:~ # for (( i=0;i<2;i++ ));do
> echo $i
> done;
0
1
- while 循环语句
while 条件
do
逻辑代码
done
-------------------------
server11:~ # i=0
server11:~ # while [[ $i -lt 2 ]];do
> let i++
> echo $i
> done;
1
2
- break、continue、exit 循环控制语句
- Break跳出for while 循环
- Continue跳过当次循环,执行下一次循环
- exit直接退出程序
shell数组和字典
- 数组
#方式一
server11:~ # array=(A B "C" D)
#方式二
server11:~ # array[0]='csc'
server11:~ # array[1]='lwl'
server11:~ # echo ${#array[*]} ## 获取数组长度 数组的长度 ${#array[@]} 和 ${#array[*]}
2
server11:~ # for((i=0;i<${#array[@]};i++)); do echo ${array[$i]}; done;
csc ## 下标遍历
lwl
server11:~ # for i in ${array[@]}; do echo $i; done;
csc ## 直接遍历value
lwl
- 字典
server11:~ # declare -A dic ## 声明 dic
server11:~ # dic=([csc]="hello" [lwl]="world")
server11:~ # echo ${!dic[*]}
lwl csc ## 打印所有key
server11:~ # echo ${dic[*]}
world hello ## 打印所有value
server11:~ # echo ${dic["lwl"]}
world ## 打印指定key的value
server11:~ # for key in $(echo ${!dic[*]}) ##遍历 dic
> do
> echo "$key : ${dic[$key]}"
> done;
lwl : world
csc : hello
shell自定义函数
function funcName(){
echo "data: $1"
}
-----函数调用----
server11:~ # source func.sh
server11:~ # funcName 10
data: 10
- 引用自定义函数文件时,使用
source func.sh加载文件 - 函数传递参数(可以使用类似于Java中的args,args[1]代表Shell中的 $1)
shell程序中常用命令
- shell程序可使用在shell交互界面的一切命令
| 常用的命令方法 | 描述 |
|---|---|
| git | 代码版本控制 |
| awk、sed | 文本处理命令 |
| mvn | java服务常用的打包命令 |
| java | jvm 启动相关 |
| docker | 服务docker镜像打包 |
| kubectl | k8s相关部署命令 |
欢迎指正文中错误
参考文章
技能篇:shell教程及脚本编写的更多相关文章
- -Shell 教程 Bash 脚本 基础语法 MD
目录 目录 Shell 简介 Shell 脚本 Shell 环境 第一个shell脚本 Shell 变量 定义变量 使用变量 只读变量 删除变量 Shell 字符串 单引号 双引号 字符串基本操作 S ...
- MySQL基础教程——mysql脚本编写
SQL,结构化查询语言,既是对数据库进行操作的语言,也是数据库脚本文件的扩展名. 要求:新建一个名为 library 的数据库,包含 book.reader 两张表,根据自己的理解安排表的内容并插入数 ...
- shell 学习之脚本编写1
脚本要求: 执行脚本后 接受输入1,显示当前时间,并提示是否继续选择. 接受输入2,显示CPU负载,并提示是否继续选择. 接受输入3,显示剩余内存,并提示是否继续选择. 接受输入0,退出脚本. ·· ...
- BAT脚本编写教程简单入门篇
BAT脚本编写教程简单入门篇 批处理文件最常用的几个命令: echo表示显示此命令后的字符 echo on 表示在此语句后所有运行的命令都显示命令行本身 echo off 表示在此语句后所有运行的命 ...
- BAT脚本编写教程入门提高篇
BAT脚本编写教程入门提高篇 批处理文件的参数 批处理文件还可以像C语言的函数一样使用参数(相当于DOS命令的命令行参数),这需要用到一个参数表示符“%”. %[1-9]表示参数,参数是指在运行批处理 ...
- 一个很不错的bash脚本编写教程
转自 http://blog.chinaunix.net/uid-20328094-id-95121.html 一个很不错的bash脚本编写教程,至少没接触过BASH的也能看懂! 建立一个脚本 Lin ...
- shell编程之服务脚本编写,文件锁以及信号捕获
shell脚本编程是linux运维工程师必备的技能,也是非常重要的一个技能,所以把shell编程学好,只有好处.基础语法我也就不讲了,学过C语言这些语言的,稍微看一下就能明白shell编程的基础,所以 ...
- BAT脚本编写教程(比较易懂和全面)
这篇文章主要介绍了BAT脚本编写教程,比较易懂和全面.适合有一定编程基础的人 作者不详.敬意! echo.@.call.pause.rem(小技巧:用::代替rem)是批处理文件最常用的几个命令, ...
- (转)shell实现多级菜单脚本编写
shell实现多级菜单脚本编写 原文:https://www.yuanmas.com/info/2gOwBPvqyb.html 这篇文章主要介绍了Shell实现多级菜单系统安装脚本实例分享,本文脚本用 ...
随机推荐
- Win64 驱动内核编程-4.内核里操作字符串
内核里操作字符串 字符串本质上就是一段内存,之所以和内存使用分开讲,是因为内核里的字符串太有花 样了,细数下来竟然有 4 种字符串!这四种字符串,分别是:CHAR*.WCHAR*.ANSI_STRIN ...
- Linux-鸟菜-0-计算机概论
Linux-鸟菜-0-计算机概论 这一章在说计算机概论,额....,总的来说看完之后还是有点收获,回忆了下计算机基本知识.没有什么可上手操作的东西,全是概念,直接把最后的总结给截图过来吧,因为概念的话 ...
- WPF之自定义委托命令
常用命令 WPF的命令实际上就是实现了ICommand接口的类,平时使用最多的是RoutedCommand类,还可以使用自定义命令. RoutedCommand只负责跑腿,并不对命名目标做任何操作,实 ...
- layUI form表单 防止多次点击重复提交
//监听 弹框-变更处理备注-提交 form.on('submit(popFormSubPass)', function (data) { //防止重复点击: 单击之后提交按钮不可选,防止重复提交 v ...
- android之布局优化
android中提供了<include />.<merge />.<ViewStub />三种优化布局. 1.<include /> <inclu ...
- Gentoo 后的几个细节的完善
Gentoo 后的几个细节的完善 目录 Gentoo 后的几个细节的完善 细节一:引导分区与 cdrom 开机正确挂载 细节二:可预见的命名规则的网络接口名称改为传统的 eth0 细节三:为管理员用户 ...
- TLS是如何保障数据传输安全(中间人攻击)
前言 前段时间和同事讨论HTTPS的工作原理,当时对这块知识原理掌握还是靠以前看了一些博客介绍,深度不够,正好我这位同事是密码学专业毕业的,结合他密码学角度对tls加解密这阐述,让我对这块原理有了更进 ...
- 2020BUAA-个人博客-案例分析
个人博客作业-软件案例分析 项目 内容 北航2020软工 班级博客 作业要求 具体要求 我的课程目标 通过案例分析提升自己对于软件工程的认识 课程收获 分析软件,了解软件的定位 第一部分 调研,评测( ...
- 基础知识:DFRduino UNO R3最全资料详解
一.概述篇:1. 什么是DFRduino UNO R3?DFRduino UNO R3是一块基与开放原始代码的Simple i/o平台,並且具有使用类似java,C语言的开发环境.让您可以快速使用Ar ...
- 2Spring对象创建小结
Spring的对象创建 Spring学习笔记 周芋杉2021/5/15 原理:工厂设计模式,通过反射创建对象. Spring工厂分类 非web环境:ClassPathXmlApplicationCon ...