前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >技能篇:shell教程及脚本编写

技能篇:shell教程及脚本编写

作者头像
潜行前行
发布2021-06-25 21:38:51
1.3K0
发布2021-06-25 21:38:51
举报
文章被收录于专栏:潜行前行

Part1前言

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

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

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

2shell脚本的执行和模块加载

  • 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的软连接

3shell 中的变量

  • 变量的赋值方法为:先写变量名称,紧接着是 "=" ,最后是值,中间无任何空格

赋值时使用带引号的作用

  • 双引号:允许通过 $ 符号引用其他变量值
  • 单引号:禁止引用其他变量值,$ 视为普通字符
  • 反引号:命令替换,提取命令执行后的输出结果
  • 示例
代码语言:javascript
复制
--- 双引号 ----
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 的执行结果

4位置参数和预定义变量

  • 预定义变量

符号

描述

$#

位置参数的数量

$*

所有位置参数的内容

$?

命令执行后返回的状态,0表示没有错误,非0表示有错误

$$

当前进程的进程号

$!

后台运行的最后一个进程号

$0

当前执行的进程名

${n}

第 {n} 个位置参数

  • shell取第一个位置参数替换程序文件中的
1,第二个替换

2 , 依次类推。$0 是一个特殊变量,它的内容是当前这个shell程序的文件名

代码语言:javascript
复制
server11:~ # cat test.sh 
#! /bin/bash
echo $1
server11:~ # bash test.sh lwl
lwl

5表达式的运算命令

  • Shell 中常见的算术运算命令

运算符

描述

(( expresions ))

用于整数运算的运算命令

let expresions

类似(()),常用于赋值表达式

expr expresions

可用于 整数运算,可执行命令

$[ expresions ]

用于整数运算

  • 对于(())运算命令,其返回值需要使用
修饰,如: i=

(($A+3))

  • 示例
代码语言:javascript
复制
server11:~ # A=10
server11:~ # B=$(($A+5))
server11:~ # echo $B
15

6表达式判断符号及相关操作符

  • 表达式判断符号

判断符号

描述

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

不支持

是否支持通配符匹配

不支持

不支持

支持

不支持

  • 示例
代码语言:javascript
复制
server11:~ # [ 1 == 1 -a 2 == 3 ] && echo true  # 2不等于3,因此true没打印出来
server11:~ # [ 1 == 1 -a 2 == 2 ] && echo true
true

7跳转条件语句

  • if 条件关键字
代码语言:javascript
复制
if  条件判断;then 
     逻辑代码
else
     逻辑代码
fi
-------------------------
server11:~ # choose="lwl"
server11:~ # if [ choose == "lwl" ];then
> echo true
> else
> echo false
> fi;
false
  • case 条件语句
代码语言:javascript
复制
case  变量  in
        one)
            逻辑代码
;;
        two)
             逻辑代码
;;
         *) 
             逻辑代码
esac
  • for 循环语句
代码语言:javascript
复制
for  条件;do
   逻辑代码
done
-------------
server11:~ # for (( i=0;i<2;i++ ));do
> echo $i
> done;
0
1
  • while 循环语句
代码语言:javascript
复制
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直接退出程序

8shell数组和字典

  • 数组
代码语言:javascript
复制
#方式一
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
  • 字典
代码语言:javascript
复制
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

9shell自定义函数

代码语言:javascript
复制
function funcName(){
  echo "data: $1"
}
-----函数调用----
server11:~ # source func.sh
server11:~ # funcName 10
data: 10
  • 引用自定义函数文件时,使用source func.sh加载文件
  • 函数传递参数(可以使用类似于Java中的args,args[1]代表Shell中的 $1)

10shell程序中常用命令

  • shell程序可使用在shell交互界面的一切命令

常用的命令方法

描述

git

代码版本控制

awk、sed

文本处理命令

mvn

java服务常用的打包命令

java

jvm 启动相关

docker

服务docker镜像打包

kubectl

k8s相关部署命令

11欢迎指正文中错误

Part2参考文章

  • Shell 教程[1]
  • Linux中编写Shell脚本[2]
  • shell编程[3]

参考资料

[1]

Shell 教程: https://www.runoob.com/linux/linux-shell.html

[2]

Linux中编写Shell脚本: https://blog.csdn.net/qq_36119192/article/details/82964713

[3]

shell编程: https://blog.csdn.net/qq_23929673/article/details/103798909

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 潜行前行 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Part1前言
    • 1关注公众号,一起交流,微信搜一搜: 潜行前行
      • 2shell脚本的执行和模块加载
        • 3shell 中的变量
          • 赋值时使用带引号的作用
        • 4位置参数和预定义变量
          • 5表达式的运算命令
            • 6表达式判断符号及相关操作符
              • 7跳转条件语句
                • 8shell数组和字典
                  • 9shell自定义函数
                    • 10shell程序中常用命令
                      • 11欢迎指正文中错误
                        • 参考资料
                    • Part2参考文章
                    相关产品与服务
                    容器服务
                    腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档