专业技能篇:shell实例教程及脚本编写
序言
大家常时不容易看到shell脚本制作,可是必须阅读文章开发设计linux脚本制作时,这也是一项不可或缺的专业技能。文中取决于给予基本的shell程序编写英语的语法和简易的案例,协助同学们快速开发,可作为shell指南应用也十分善
- shell脚本制作的实行和控制模块载入
- shell中的自变量
- 部位主5201;1442;数和预订义自变量
- 关系式的计算指令
- 关系式分辨标记及有关运算符
- 自动跳转if语句
- 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的4046;别 , 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
关系式的计算指令
| 操作符 |
叙述 |
| (( 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 自变量 in
one)
逻辑性编码
;;
two)
逻辑性编码
;;
*)
逻辑性编码
esac
for 标准;do
逻辑性编码
done
-------------
server11:~ # for (( i=0;i<2;i ));do
> echo $i
> done;
0
1
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 ## 字符解析xml
lwl
server11:~ # for i in ${array[@]}; do echo $i; done;
csc ## 立即解析xmlvalue
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[*]}) ##解析xml 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 实例教程
- Linux中撰写Shell脚本制作
- shell程序编写