shell脚本编写的整理(1)

1、shell脚本的特点及用途
2、全局变量、局部变量、本地变量
3、位置变量、特殊变量、只读变量
4、退出状态、算数运算、赋值
5、逻辑运算、条件测试、数值测试
6、文件测试、文件权限测试、文件属性测试
7、read命令、bash的配置

1、shell脚本的特点及用途

程序:指令+数据

程序编程风格:

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

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

shell程序:提供了编程能力,解释执行

编程逻辑处理方式:顺序执行   循环执行   选择执行

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

格式要求:首行shebang机制    #!/bin/bash

shell脚本用途: 自动化常用命令 ;执行系统管理和故障排除;创建简单的应用程序;处理文本或文件

检查语法错误:bash -n f1.sh

调试执行过程:bash -x f1.sh

变量

按数据的存储方式分为:字符和数字(整型,浮点型)

bash不支持浮点

强类型:变量不经过强制转换,它永远是这个数据类型,不允许隐式的类型转换。一般定义变量时必须指

定类型、参与运算必须符合类型要求;调用未声明变量会产生错误

弱类型:语言的运行时会隐式做数据类型转换。无须指定类型,默认均为字符型;参与运算会自动进行隐

式类型转换;变量无须事先定义可直接调用

bash属于弱类型

name=”mage”

echo $name

mage

如果更改name=”wang”

echo $name

wang

在内存空间里面有另一块位置被wang占用,原来mage那一个占用并没有消失!只是没有了引用

保留原文件的格式必须加双引号

如name=cat /etc/fstab

echo “$name”则有格式

echo  $name 没有格式

不要使用shell的保留关键字如if,for 、,hostname

变量名尽量用英文单词,不要用英文的简写,容易混淆,或者

student_name

统一命名方式:驼峰法

第一个单词首字母不大写,后续的所有单词的首字母全大写

studentNameFile

 

bash 中变量的种类

运行脚本就是在当前shell开启一个子进程

显示当前进程编号

echo $$

查看进程树命令

pstree -p

新增bash

bash

退出当前bash

exit

2、全局变量、局部变量、本地变量

环境变量

就是全局变量,生效范围为当前shell进程及其子进程

查询系统中当前所有环境变量

env

export

declare -x

例子:

1.

export name=mage

则name变为全局变量

在当前以及子进程里执行echo $name都是mage

注意:全局变量只能父进程传子进程,不能子进程传父进程

2.删除变量命令

unset name

注意:这里的变量name不用加$,一般能识别出就不加,但是有些不能识别出的要加,这个要经验积累.

一般编写完脚本最后都会用unset命令清楚变量这个是好习惯!!

set     查看系统所有变量,包括本地变量,环境变量

局部变量: 生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效

本地变量:生效范围为当前shell进程中某代码片段,通常指函数

3、位置变量、特殊变量、只读变量

位置变量

用于让脚本在脚本代码中调用通过命令行传递给它的参数

$1 $2 ….:对应调用第1,第2个等参数,shift[n]换位置

例子:

$1,$2表示脚本后的第1和第2个参数

例如:    backup.sh a b c

$1就是a  $2就是b

shift   变量移动

shift  移动一次

shift 2  移动两次

set — 清空所有位置变量

特殊变量

$0 : 表示命令本身

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

$*:传递给脚本的所有参数,全部参数合为一个字符串

$@:引用传递给脚本的所有参数,每个参数为独立字符串

($@和$*只有被双引号包起来的时候才会有差异)

$_:前一个命令最后一个字符串

例子:

1.echo a b c    结果a b c

echo $_      结果c

2. 在/root/bin下写脚本arg.sh

echo “1st arg is $1”

echo “2st arg is $2”

echo “3st arg is $3”

echo “All args are $*”

echo “All args are $@”

echo “The args number is $#”

echo “The script name is $0”    如果不要路径名则 basename $0

然后执行

arg.sh xxx yy zzzz

显示

1st arg is xxx

2st arg is yy

3st arg is zzzz

All args are xxx yy zzzz

All args are xxx yy zzzz

The args number is 3

The script name is /root/bin/arg.sh

注意: 如果有第10个参数,则脚本里应写为:

echo “10st arg is ${10}” 否则系统会把$10误认为 $1和0上题就是显示a0

3.scp f1 wang@172.20.102.77:/home/wang/bin

写脚本scp.sh

echo “Start copy..”

scp $* wang@172.20,102.77:/home/wang/bin

echo “copy is finished”

执行scp.sh f1

就是把f1文件传送到172.20.102.77里的用户wang登陆的,/home/wang/bin目录下

第一次连会问你输入y