shell脚本基础
shell脚本:
包含一些命令或声明,并符合一定格式的文本文件
格式要求:首行shebang机制
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
shell脚本的用途有:
自动化常用命令
执行系统管理和故障排除
创建简单的应用程序
处理文本或文件
创建shell脚本
第一步:使用文本编辑器来创建文本文件
第一行必须包括shell声明序列:#!
#!/bin/bash
添加注释
注释以#开头
第二步:运行脚本
给予执行权限,在命令行上指定脚本的绝对或相对路径
直接运行解释器,将脚本作为解释器程序的参数运行
直接执行脚本权限会拒绝,要给脚本加个X权限
脚本规范
脚本代码开头约定
1、第一行一般为调用使用的语言
2、程序名,避免更改文件名为无法找到正确的文件
3、版本号
4、更改后的时间
5、作者相关信息
6、该程序的作用,及注意事项
7、最后是各版本的更新简要说明
示例:
#!/bin/bash
# ——————————————
# Filename: hello.sh
# Revision: 1.1
# Date: 2017/06/01
# Author: wang
# Email: wang@gmail.com
# Website: www.magedu.com
# Description: This is the first script
# ——————————————
# Copyright: 2017 wang
# License: GPL
echo “hello world”
脚本调试
bash -n f1.sh 检测脚本中语法的错误
设置变量b,故意将$后的小括号打成中文的括号,然后检测,就会报错,提示你括号打错了
bash -x f1.sh 调试执行
每一步都显示出来
变量
变量:命名的内存空间
数据存储方式:
字符:
数值:整型,浮点型(有小数)
变量:变量类型
作用:
1、数据存储格式
2、参与的运算
3、表示的数据范围
类型:
字符
数值:整型、浮点型
强类型:变量不经过强制转换,它永远是这个数据类型,不允许隐式的类型转换。一般定义变量时必须指定类型、参与运算必须符合类型要求;调用未声明变量会产生错误
如java,c#
弱类型:语言的运行时会隐式做数据类型转换。无须指定类型,默认均为字符型;参与运算会自动进行隐式类型转换;变量无须事先定义可直接调用
如:bash 不支持浮点数,php
变量命名法则:
1、不能使程序中的保留字:例如if, for
2、只能使用数字、字母及下划线,且不能以数字开头
3、见名知义
4、统一命名规则:驼峰命名法
bash中变量的种类
根据变量的生效范围等标准:
1.本地变量:生效范围为当前shell进程;对当前shell之外的其它shell进程,包括当前shell的子shell进程均无效
设置个本地变量d=444,当前shell是一级(echo $SHLVL查看当前shell是几级shell),可以引用变量d。进入2级shell,再引用变量d,不会显示吃结果, 说明变量d已经不存在了,进入3级shell,还是一样。当再次返回一级shell,又能引用变量d了,所以本地变量只对当前shell有效,对当前shell的子shell及以下的shell都无效。
变量赋值:name=‘value’
可以使用引用value:
(1) 可以是直接字串; name=“root”
(2) 变量引用:name=”$USER”
(3) 命令引用:name=`COMMAND`(命令用反单引号引起来) name=$(COMMAND)
变量引用:${name} $name
“”:弱引用,其中的变量引用会被替换为变量值
”:强引用,其中的变量引用不会被替换为变量值,而保持原字符串
显示已定义的所有变量:set(既可以查本地变量又能查环境变量)
删除变量:unset name(在脚本中设置了变量,用完了之后最好把变量删除掉)
2.环境变量:生效范围为当前shell进程及其子进程
设置环境变量a,当前是一级shell,能引用环境变量a,进入2级shell,依旧能引用,3级也是如此,所以环境变量对当前shell及其子shell或以下都有效。
变量声明、赋值:
export name=VALUE
declare -x name=VALUE
变量引用:$name, ${name}
显示所有环境变量:(只显示环境变量)
env
printenv
export
declare -x
删除变量:(在脚本中设置了变量,用完了之后最好把变量删除掉)
unset name
bash内建的环境变量:
PATH
SHELL
USER
UID
HOME
PWD
SHLVL
LANG
HOSTNAME
HISTSIZE
—
source
写一个脚本66.sh,内容为设置一个本地变量f=1111,然后把本地变量f显示出来(脚本中变量f是在2级shell设置的),写完脚本后,在当前shell也设置一个本地变量f=magedu,然后把脚本66.sh加上权限,用路径执行脚本,结果为1111,在当前shell显示变量f结果为magedu,再用source来执行脚本,结果还为1111,但再在当前shell显示变量f结果为1111,所以可以得出结论:source在当前shell执行脚本后,脚本中设置的变量(在当前shell的子shell中设置的)会覆盖当前shell相同的变量。用source执行脚本是极为不安全的,因为会破坏掉当前shell的变量。
.也就是source
3.局部变量:生效范围为当前shell进程中某代码片断(通常指函数)
4.位置变量:$1, $2, …来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数
位置变量:在脚本代码中调用通过命令行传递给脚本的参数
$1, $2, …:对应第1、第2等参数,shift [n]换位置
这的$10和$11不是整体,是$1和0,$1和1
所以$10显示的是第一个参数和0,$11显示的是第一个参数和1
把10和11用大括号括起来,使其变成一个整体 ,这样就能使${10}显示第10个参数,${11}显示第11个参数。
$0: 命令本身
$*: 传递给脚本的所有参数,全部参数合为一个字符串
$@: 传递给脚本的所有参数,每个参数为独立字符串
$#: 传递给脚本的参数的个数
$@ $* 只在被双引号包起来的时候才会有差异
set —清空所有位置变量
5.特殊变量:$?, $0, $*, $@, $#,$$
6.只读变量: 只能声明,但不能修改和删除
声明只读变量:
readonly varname
declare -r varname
查看所有的只读变量
readonly -p
(只读变量不能修改和删除)reboot重启后只读变量会自动消失。
退出状态
进程使用退出状态来报告成功或失败
0 代表成功,1-255代表失败
$? 变量保存最近的命令退出状态
例如:
ping-c1-W1 hostdown&>/dev/null
echo $?
退出状态码
bash自定义退出状态码
exit [n]:自定义退出状态码
注意:脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字
注意:如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码
转译:
\ 完全转译
“”部分转译 (\ ` ! $ 不能转译)
” 完全转译
引用变量时
$varname
“$varname”
${varname}
当变量值当中包含换行符,如果希望引用出的值同样包含换行符,只能使用“$varname”
$()和${}的区别:当引用一些命令的结果时用$(),当引用的是设置变量的名字时用${},来划分界限。
算术运算
bash中的算术运算:help let
+, -, *, /, %取模(取余), **(乘方)在bc当中乘方是^
实现算术运算:
(1) let var=算术表达式
(2) var=$[算术表达式]
(3) var=$((算术表达式))
(4) var=$(expr arg1 arg2 arg3 …) 乘法时要转译* ,即\*
(5) declare –i var = 数值
(6) echo ‘算术表达式’ | bc(这种算术表达乘方是^)
bash有内建的随机数生成器:$RANDOM(0-32767)
echo $[$RANDOM%50] :0-49之间随机数
echo $[$RANDOM%72+1]取个随机数0到71再加1(就是1到72)
赋值
增强型赋值:
+=, -=, *=, /=, %=
let varOPERvalue
例如:let count+=3
自加3后自赋值
自增,自减:
let var+=1
let var++
let var-=1
let var–
原创文章,作者:fuming,如若转载,请注明出处:http://www.178linux.com/83748