技能篇:shell教程及脚本编写
前言
我们常时不会见到shell脚本,但是需要阅读开发linux脚本时,这又是一项必不可少的技能。本文在于提供基础的shell编程语法和简单的实例,帮助同学快速开发,可当做shell手册使用也非常善
- shell脚本的执行和模块加载
- shell中的变量
- 位置参数和预定义变量
- 表达式的运算命令
- 表达式判断符号及相关操作符
- 跳转条件语句
- shell数组和字典
- shell自定义函数
- shell程序中常用命令
关注公众号,一起交流,微信搜一搜: 潜行前行
github地址,感谢star
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 变量 inone)逻辑代码
;;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"
}
-----函数调用----
$ 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 教程
- Linux中编写Shell脚本
- shell编程
技能篇:shell教程及脚本编写相关推荐
- 2021年大数据Kafka(三):❤️Kafka的集群搭建以及shell启动命令脚本编写❤️
全网最详细的大数据Kafka文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 Kafka的集群搭建以及shell启动命令脚本编写 一.搭建 ...
- Linux中shell语法和脚本编写
Linux中shell语法和脚本编写 原文地址:学习shell的语法,及脚本编写 其它相关辅助资料: 编写shell脚本所需的语法和示例 基础linux指令&简单的shell语法和脚本编写 什 ...
- android x866.0 教程,poco脚本编写之api
连接设备后使用poco 使用connect_device连接好指定设备后,会返回一个Device对象,将这个对象传入 AndroidUiautomationPoco第一个参数里进行poco的初始化, ...
- shell教程(脚本 运行 传递 )
Shell变量 定义变量时,变量名不加美元符号($,PHP语言中变量需要),如: [root@localhost ~]# vim calculator.sh your_name="gongm ...
- C#【必备技能篇】使用批处理脚本(.bat文件)打开控制台应用程序
背景: 有时,需要使用.bat文件来运行一个.exe程序(一般是控制台应用程序),可以点击bat文件运行C#写的控制台应用程序. 示例: [1]Test.exe程序 和 click.bat文件 放在一 ...
- python编写脚本教程_python脚本编写教程gee引擎解密工具
尽管能够这样做,你也不可能一下把握全句的逻辑关系使用骨架.Spring Initializr创建项目时,往往自动导入了Junit的依赖,看一下pom.xml中有没有,没有就导入 原理等同上面方法,将会 ...
- 技能篇:开发必备linux命令大全-稳赚不亏
我们的服务一般都是在linux系统运行,因此了解一些关于linux命令是必须.接下来将一一详细介绍一些常用的linux的命令 文件操作 远程登录与操作 磁盘挂载 进程管理 启动和结束 系统性能参数查看 ...
- 技能篇:开发必备linux命令大全
我们的服务一般都是在linux系统运行,因此了解一些关于linux命令是必须.接下来将一一详细介绍一些常用的linux的命令 文件操作 远程登录与操作 磁盘挂载 进程管理 启动和结束 系统性能参数查看 ...
- Linux系统shell脚本、python脚本编写
GPU排队脚本 python脚本 GPU排队脚本 ---- GPU一旦空闲触发脚本执行程序 参考: GPU排队脚本(python脚本) cmd = 'bash run.sh' 该句设置要执行的pyth ...
最新文章
- ajax跨界表单,ajax使用jsonp解决跨域问题
- 对业务系统的监控 No.118
- Linux系统下使用桥接模式,无法ping通外网解决问题方案!
- adc采样时间_ADC采样原理
- 如何区分PLC输入是源型输入还是漏型输入?
- android渐变布局,关于Android的径向渐变高级编程的实现
- 六合彩:Linux基金会项目合体之后会更精彩吗?
- Linux 操作命令大全
- 《keras中文文档》资料分享
- Pygame之滑稽球壁碰
- html中图片旋转木马,css3的图片3D旋转图片旋转木马
- 我只想保持本色,和少年的心气。
- 用tensorboard可视化log日志
- Teardrop攻击初体验
- java实现计算器_java高级计算器的实现
- document.write详解
- 债券型基金、股票型与混合型基金的选择方法,以及指数基金有低估和高估阶段
- 跟李沐学深度学习-softmax回归
- 【数据库修复】.Globeimposter-Alpha66qqz勒索病毒的数据库文件修复
- python 循环嵌套break continue猜字游戏_Python代码的人机大战(循环嵌套)
热门文章
- pip install pygame无法下载的解决方案
- python在心理学研究中的应用有哪些_心理学的应用有哪些?
- 架构解析 | 从ABTest是啥开始说
- Vant Weapp 0.5.11 发布,有赞小程序 UI 组件库
- C++使用正则表达式判断GUID格式
- 后端传list集合,前端接受
- 【UE4】UE C1083 无法打开包括文件: “xxx.h”: No such file or directory
- TUXEDO在自动语音应答系统中的使用
- 2023 年五个最佳被动收入来源
- mac系统文本复制粘贴问题