shell脚本

t01c8d0a587f7a91802

编程基础:

程序:指令+数据

程序编程风格;

面向过程:以指令为中心,数据服务于指令

面对对象:以数据为中心,指令服务于数据

高级:

编译:高级语言—>编译器—>目标代码

Java、C#

解释:高级语言—>解释器—>机器代码

shell、Perl、Python

编程逻辑处理方式:

顺序执行

循环执行

选择执行

shell编程:过程式、解释执行

编程语言的基本结构:

各种系统命令的组合

数据存储:变量、数组

表达式:a + b

语句:if

格式要求:首行shebang机制

#!/bin/bash

#!/usr/bin/python

#!/usr/bin/perl

大批量重复的程序可以写成脚本

脚本格式

shebang要求必须写

添加注释

注释用#开头

运行脚本给执行权限

脚本命令没有关联时前面的命令报错不影响后面的命令;如有关联时反之。

bash -n [脚本] #测试脚本

bash -x [脚本] #调试执行

+表示执行的命令

++表示嵌套的执行命令

变量:命名空间的数据

变量定义命令时加反向单引号

调用变量时要加$

变量引用文件,显示时加双引号保留其格式

例如:fdtab=cat /etc/fdtab

echo “fdtab”

bash变量不分类型,直接赋值即可(都是字符,不支持浮点数)

关键字不能当变量

例如:if for ls hostname等

变量不能用数字或数字打头

见名知意

统一命名规则:驼峰命名法

例如:HostName、hostName

bash变量的种类

局部变量:特定场合有效,当前进程有效,其子进程无效,其父进程也无效

pstree -p #查看进程树附属关系

环境(全局)变量:当前shell进程及其子进程有效,子进程可以更改赋值但不能父进程的赋值不更改

export #赋值全局变量

unset [变量] #删除变量,不加$

set 显示所有变量以及函数

printenv:同上

export:同上

declare -x:同上

declare -r:显示“常量”

位置变量

定义10以上的变量加{}系统才能识别数字变量

$1,$2…..$n:对应第1、第2等参数($10)使用时用大括号扩起来${10}

$*:把所有参数合并成一个整体,用双引号引起等同于$@

$0:如果是软连接,显示其软链接的文件名

$@:每个参数为独立字符

$#:传递给脚本的参数的个数

shift:移动输入参数,默认移动一位(换位)

set–:删除所有位置变量

特殊变量

$_:上一个命令的参数

$*:把所有参数合并成一个整体,用双引号引起等同于$@

$0:如果是软连接,显示其软链接的文件名

$@:每个参数为独立字符

$#:传递给脚本的参数的个数

$$:当前进程的ID

$?变量保存最近命令退出状态

shift:移动输入参数,默认移动一位

set–:删除所有位置变量

 

 

bash内建的环境变量:

$PATH

$SHELL

$USER

$UID

$HOME

$PWD

$SHLVL:shell嵌套深度

$LANG

$$:当前进程ID

$PPID:父进程ID

$MAIL

$HOSTNAME

$HISTSIZE

—:上一个命令的最后一个字符串

声明只读变量(常量):

readonly name:只能调用不能更改不能删除,生命周期=当前进程的有效生命周期

declare -r name:

命令加小括号:相当于开启了一个临时的子进程但不是子进程,执行完命令后回到当前进程

例如:(cd /etc ; rm -rf ) #执行完回到当前目录

声明变量加小括号:临时声明执行,只执行一次后删除

例如:(name=wang;echo $name)

小括号开启子shell不影响当前shell

x=1;echo “pid=$$”;(echo “subpid=$$”;echo “subx=$x”;x=2;echo “subx2=$x”);echo x=$x

pid=2887

subpid=2887

subx=1

subx2=2

x=1

大括号开启子shell影响当前shell

退出状态

0表示成功,1-255表示失败

语法错误$?不为零,命令错误$?由最后一条命令决定

脚本中exit可以定义$?返回的值

ping -c# [IP地址] #指定ping几次

算术运算:

+,-,*,/,%取余,**乘方

let 变量=算术表达式

变量=$[算术表达式]

变量=$((算术表达式))

变量=$(expr arg1 arg2 arg3 …)

declare –i var = 数值 #把变量声明成数值

echo ‘算术表达式’ | bc

赋值

增强型赋值:

+=, -=, *=, /=, %=

逻辑运算

&:与

0&0=0

0&1=0

1&0=0

1&1=1

0为false假

1为true真

|:或

0|0=0

0|1=1

1|0=1

1|1=1

^:异或

相同为假,不同为真

0^0=0

0^1=1

1^0=1

1^1=0

例如:

替换a和b的赋值

a=6

b=4

a=$[a^b];b=$[a^b];a=$[a^b];echo $a $b

&&:短路与,

例如:cmd1&&cmd2

命令一为假,命令二则不执行,命令一为真,执行命令二

||:短路或,

例如:cmd1||cmd2

命令一为真,命令二则不执行,命令一为假,执行命令二

!:非

test #判断变量

[ -n 变量 ] 判断变量是否为非空0为非空1为空 相当于[ 变量 ]

[ -z 变量 ] 判断变量是否为空1为非空0为空

[[]] 使用正则表达式时使用

数值测试

-v 变量 :查看变量是否赋值

数值测试:

-gt  是否大于

-ge  是否大于等于

-eq  是否等于

-ne  是否不等于

-lt  是否小于

-le  是否小于等于

字符串测试:

==  是否等于

>  ascii码是否大于ascii码

<  是否小于

!=  是否不等于

=~  左侧字符串是否能够被右侧的扩展正则所匹配,需要配合[[]]使用

bash的文件测试

bash [脚本]:开启一个子进程相当于(./脚本)

read :把标准输入赋值给一个或者多个变量用空格分隔开

-p:指定要显示的提示

-s:静默输入

read x y z <<< “i j k”:批量赋值

.和source以及bash执行的区别

bash [脚本]和./[脚本]执行结果相同,在脚本的子进程中运行

source [脚本]和. [脚本]:在当前shell运行

脚本中不支持命令别名;也不支持定义别名

变量$-

h:开启hash缓存表功能

i:表示当前shell是交互式shell

m:打开监控模式

B:大括号扩展

H:打开history的H选项

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/95703

发表评论

登录后才能评论

联系我们

400-080-6560

在线咨询:点击这里给我发消息

邮件:1823388528@qq.com

工作时间:周一至周五,9:30-18:30,节假日同时也值班