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

(0)
老司机丨快上车老司机丨快上车
上一篇 2018-04-11 19:35
下一篇 2018-04-11 20:46

相关推荐

  • N31第一周

    一、计算机的组成及其功能。 计算机是由运算器、控制器、存储器、输入设备、输出设备五大部件组成,每一个部分分别按照要求执行特定的基本功能。 运算器:运算器的主要功能是对数据进行各种运算。 控制器:控制器是整个计算机系统的控制中心,它指挥计算机各部分协调地工作,保证计算机按照预先规定的目标和步骤有条不紊的进行操作及处理。 存储器:存储器的主要功能是存储程序和各种…

    2018-06-19
  • 学习笔记(5)

    学习笔记(5)

    Linux笔记 2018-04-22
  • Linux发行版的基础目录名称命名法则及功用规定

    Linux命名法则 文件名严格区分大小写 文件名不能使用/字符 最长不能超过255字符 以.开头为隐藏文件 /bin 存放的系统命令   /boot 存放着系统的启动文件和内核   /dev 设备文件主目录(设备不在这里,具体设备信息/proc目录中)   /proc 系统进程和系统硬件信息   /etc 系统主配置文…

    Linux笔记 2018-05-13
  • LVM详情

    lvm 原理 用法

    Linux笔记 2018-03-29
  • 磁盘及文件系统管理(一)

    简述磁盘及文件系统管理

    Linux笔记 2018-05-05
  • DHCP&PXE&Cobbler

    DHCP&PXE&Cobbler

    2018-08-01