前言

我们常时不会见到shell脚本,但是需要阅读开发linux脚本时,这又是一项必不可少的技能。本文在于提供基础的shell编程语法和简单的实例,帮助同学快速开发,可当做shell手册使用也非常善

  • shell脚本的执行和模块加载
  • shell中的变量
  • 位置参数和预定义变量
  • 表达式的运算命令
  • 表达式判断符号及相关操作符
  • 跳转条件语句
  • shell数组和字典
  • shell自定义函数
  • shell程序中常用命令

关注公众号,一起交流,微信搜一搜: 潜行前行

shell脚本的执行和模块加载

  • shell脚本的执行

    • bash scriptNamesh 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教程及脚本编写的更多相关文章

  1. -Shell 教程 Bash 脚本 基础语法 MD

    目录 目录 Shell 简介 Shell 脚本 Shell 环境 第一个shell脚本 Shell 变量 定义变量 使用变量 只读变量 删除变量 Shell 字符串 单引号 双引号 字符串基本操作 S ...

  2. MySQL基础教程——mysql脚本编写

    SQL,结构化查询语言,既是对数据库进行操作的语言,也是数据库脚本文件的扩展名. 要求:新建一个名为 library 的数据库,包含 book.reader 两张表,根据自己的理解安排表的内容并插入数 ...

  3. shell 学习之脚本编写1

    脚本要求: 执行脚本后 接受输入1,显示当前时间,并提示是否继续选择. 接受输入2,显示CPU负载,并提示是否继续选择.  接受输入3,显示剩余内存,并提示是否继续选择. 接受输入0,退出脚本. ·· ...

  4. BAT脚本编写教程简单入门篇

    BAT脚本编写教程简单入门篇 批处理文件最常用的几个命令: echo表示显示此命令后的字符 echo on  表示在此语句后所有运行的命令都显示命令行本身 echo off 表示在此语句后所有运行的命 ...

  5. BAT脚本编写教程入门提高篇

    BAT脚本编写教程入门提高篇 批处理文件的参数 批处理文件还可以像C语言的函数一样使用参数(相当于DOS命令的命令行参数),这需要用到一个参数表示符“%”. %[1-9]表示参数,参数是指在运行批处理 ...

  6. 一个很不错的bash脚本编写教程

    转自 http://blog.chinaunix.net/uid-20328094-id-95121.html 一个很不错的bash脚本编写教程,至少没接触过BASH的也能看懂! 建立一个脚本 Lin ...

  7. shell编程之服务脚本编写,文件锁以及信号捕获

    shell脚本编程是linux运维工程师必备的技能,也是非常重要的一个技能,所以把shell编程学好,只有好处.基础语法我也就不讲了,学过C语言这些语言的,稍微看一下就能明白shell编程的基础,所以 ...

  8. BAT脚本编写教程(比较易懂和全面)

    这篇文章主要介绍了BAT脚本编写教程,比较易懂和全面.适合有一定编程基础的人   作者不详.敬意! echo.@.call.pause.rem(小技巧:用::代替rem)是批处理文件最常用的几个命令, ...

  9. (转)shell实现多级菜单脚本编写

    shell实现多级菜单脚本编写 原文:https://www.yuanmas.com/info/2gOwBPvqyb.html 这篇文章主要介绍了Shell实现多级菜单系统安装脚本实例分享,本文脚本用 ...

随机推荐

  1. 票据传递攻击(Pass the Ticket,PtT)

    目录 黄金票据 生成票据并导入 查看票据 验证是否成功 黄金票据和白银票据的不同 票据传递攻击(PtT)是一种使用Kerberos票据代替明文密码或NTLM哈希的方法.PtT最常见的用途可能是使用黄金 ...

  2. Maven不扫描java文件夹下的配置文件解决办法

    <build> <resources> <resource> <directory>src/main/java</directory> &l ...

  3. Pytorch_Part2_数据模块

    VisualPytorch beta发布了! 功能概述:通过可视化拖拽网络层方式搭建模型,可选择不同数据集.损失函数.优化器生成可运行pytorch代码 扩展功能:1. 模型搭建支持模块的嵌套:2. ...

  4. Java堆的理解

    堆的核心概述 所有的对象实例以及数组都应当在运行时分配在堆上 从实际实用角度看 --"几乎所有的对象实例都在堆中分配内存" 数组和对象可能永远不会存储在栈上,因为栈帧中保存引用,这 ...

  5. 探索GaussDB(DWS)的过程化SQL语言能力

    摘要:在当前GaussDB(DWS)的能力中主要支持两种过程化SQL语言,即基于PostgreSQL的PL/pgSQL以及基于Oracle的PL/SQL.本篇文章我们通过匿名块,函数,存储过程向大家介 ...

  6. [Linux] Shell 脚本实例(超实用)

    文件操作 为文件(test.sh)增加执行权限 chmod +x test.sh 列出当前文件夹下所有文件(每行输出一个) 1 #!/bin/bash 2 dir=`ls ./` 3 for i in ...

  7. U盘PE重装系统导致D、E、F盘消失

    U盘PE重装系统导致D.E.F盘消失 听语音 原创 | 浏览:1251 | 更新:2014-08-18 18:46 | 标签:u盘 重装 解决使用U盘PE重装系统导致的错误问题 工具/原料   制作好 ...

  8. 寻找CPU使用率高的进程方法

    寻找CPU使用率高的进程方法 发布时间:  2017-07-13 浏览次数:  1362 下载次数:  0 问题描述 节点报CPU使用率高,甚至出现"ALM-12016 CPU使用率超过阈值 ...

  9. Sed常用功能个人整理

    Sed常用功能个人整理 AsdilFibrizo关注 2019.06.24 10:23:41字数 240阅读 15 Sed对1G以下的数据效率很高这里介绍一些个人在工作中遇到的sed问题 1.查找字段 ...

  10. touch -d 同时修改atime与mtime

    1.touch命令 touch命令用于创建空白文件或设置文件的时间,格式为"touch [选项] [文件]". 在创建空白的文本文件方面,这个touch命令相当简捷,简捷到没有必要 ...