首页 > 代码库 > bash脚本基础
bash脚本基础
编程基础:程序:指令+数据
过程式:以指令为中心,数据服务于指令
对象式:以数据为中心,指令服务于数据
shell程序:提供了编程能力,解释执行
编程语言:低级:汇编
高级:
编译:高级语言–>编译器–>目标代码 java,c#
解释:高级语言–>解释器–>机器代码 shell,perl,python
编程逻辑处理方式:
顺序执行
循环执行
选择执行
shell编程:过程式、解释执行
编程语言的基本结构:
各种系统命令的组合
数据存储:变量、数组
表达式:a + b
语句:if
shell脚本:包含一些命令或声明,并符合一定格式的文件
格式要求:#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
shell脚本的用途:
自动化常用命令
执行系统管理和故障排除
创建简单的应用程序
处理文本或文件
shell脚本的创建:
使用文本编辑来创建文本文件
第一行必须包括shell声明序列:#!/bin/bash
#注释行 (可以写上时间,作者,做什么用)
写完后运行脚本:
bash -n file 检测脚本中的语法错误,但不能检查命令错误
bash -x file 调试执行,可以检查命令错误
chmod +x file 后 建议使用bash file 运行
变量:
字符型:
数值型:整型,浮点型
变量命名法则:
1 、不能使程序中的保留字:例如if, for
2 、只能使用数字、字母及下划线,且不能以数字开头
3 、见名知 义
4 、统一命名 规则:驼峰命名法
强类型:定义变量时必须指定类型、参与运算必须符合类型要求;调用未声明变量会产生错误 如: java,c
弱类型:无须指定类型,默认均为字符型;参与运算会自动进行隐式类型转换;变量无须事先定义可直接调用
如:bash 不支持浮点数,python
bash中的变量种类:
本地变量:生效范围为当前shell 进程;对当前shell 之外的其它shell 进程,包括当前shell 的子shell 进程均无效
环境变量:生效范围为当前shell进程及其子进程
局部变量:生效范围为当前shell 进程中某代码片断( 通常指函数)
位置变量:$1, $2, … 来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数
变量赋值:name=‘value’
可以使用引用value:
(1) 可以是直接字串; name=“root”
(2) 变量引用:name=”$USER”
(3) 命令引用:name=COMMAND
name =$(COMMAND)
变量引用:$name
“” :弱引用,其中的变量引用会被替换为变量值
” :强引用,其中的变量引用不会被替换为变量值,而保
持原字符串
? 显示已定义的所有变量:set
? 删除变量:unset name
变量声明、赋值: 定义环境变量
exprot name=value
declare -x name=value
显示所有环境变量:
export
env
printenv
删除定义的变量:unset name (养成习惯,每次在结束后删除定义的变量)
bash 有许多内建的环境变量: :PATH, SHELL, USRE,UID,HISTSIZE, HOME, PWD, OLDPWD, HISTFILE
只读变量:只能声明,但不能修改和删除
声明只读变量:
readonly name
declare -r name
查看只读变量:
readonly -p
位置变量:在脚本代码中调用通过命令行传递给脚本参数
$1, $2, … :对应第1 、第2 等参数,shift [n]
$*: 传递给脚本的所有参数,全部参数合为一个字符串
$@: 传递给脚本的所有参数,每个参数为独立字符串
$#: 传递给脚本的参数的个数
$@ $* 只在被双引号包起来的时候才会有差异
set — 清空所有位置变量
当位置参数达到10以上需要加上大括号 比如 ${10} ${11}
$0 脚本名 使用basename可以取基名
shift # 清理单独的位置参数#清理多少个
bash 中的算术运算:help let
+, -, *, /, % 取模(取余), ** (乘方)
实现算术运算:
(1) let var= 算术表达式
(2) var=$[ 算术表达式] (建议使用中括号,方便查看脚本)
(3) var=$(( 算术表达式))
(4) var=$(expr arg1 arg2 arg3 …)
(5) declare –i var = 数值
(6) echo ‘ 算术表达式’ | bc
乘法符号有些场景中需要转义 ,如*
bash 有内建的随机数生成器:$RANDOM (1-32767)
echo $[$RANDOM%50] :0-49 之间随机数
增强型赋值:
+=, -=, *=, /=, %=
let varOPERvalue
自增,自减:
j=i++ 先赋值给j,然后再加1
j=++1 先加1赋值给j,
逻辑运算: || && !
异或:^ 异或的两个值,相同为假,不同为真
进程使用退出状态来报告成功或失败
? 0 代表成功,1 -255 代表失败
? $? 变量保存最近的命令退出状态
条件测试:
判断某需求是否满足,需要由测试机制来实现
专用的测试表达式需要由测试命令辅助完成测试过程
评估布尔声明,以便用在条件执行中
若真,则返回0
若假,则返回1
测试命令:
? test EXPRESSION
? [ EXPRESSION ]
? [[ EXPRESSION ]]
注意:EXPRESSION 前后必须有空白字符
$ [ “$A” == “$B” ] && echo “Strings are equal”
$ [ “$A” -eq “$B” ] && echo “Integers are equal”
根据退出状态而定,命令可以有条件地运行 && ||
数值测试:
-gt: 是否大于 -ge: 是否 大于等于
-eq: 是否等于 -ne: 是否 不等于
-lt: 是否小于 -le: 是否 小于等于
字符串测试:
== :是否等于;
>: ascii 码是否大于ascii码
<: 是否小于
!=: 是否不等于
=~: 左侧字符串是否能够被右侧的PATTERN所 所 匹配
注意: 此表达式一般用于[[ ]] 中;扩展的正则表达式
-z “STRING” :字符串是否为空,空为真,不空为假
-n “STRING” :字符串是否不空,不空为真,空为假
注意:用于字符串比较时的用到的操作数都应该使用引号
文件测试:
-e FILE: 文件存在性测试,存在为真,否则
-d FILE: 是否存在且为目录文件
-b FILE: 是否存在且为块设备文件
…….
文件权限测试:-r -w -x 是否存在且有权限
特殊权限测试:-u -g -k 是否存在且有特殊权限
文件大小测试:-s 是否存在且非空
文件是否打开:-t fd fd 表示文件描述符是否已经打开且与某终端相关 -N FILE :文件自动上一次被读取之后是否被修改过
-O FILE : 当前有效用户是否为文件属主
-G FILE :当前有效用户是否为文件属组
双目测试:
FILE1 -ef FILE2: FILE1 与FILE2 是否指向同一个设
备上的相同inode
FILE1 -nt FILE2: FILE1 是否新于 于FILE2
FILE1 -ot FILE2: FILE1 是否旧于 于FILE2
组合条件测试:
第一种方式:
COMMAND1 && COMMAND2 并且
COMMAND1 || COMMAND2 或者
! COMMAND 非
如:[[ -r FILE ]] && [[ -w FILE ]]
第二种方式:
EXPRESSION1 -a EXPRESSION2 并且
EXPRESSION1 -o EXPRESSION2 或者
! EXPRESSION
必须使用测试命令进行
使用read命令来接受输入:
-p 指定要显示的提示
-s 静默输入
-n N 指定输入的字符长度N
-d ‘ 字符’ 输入结束符
-t N TIMEOUT 为N秒
read 从标准输入中读取值,给每个单词分配一个变量,所有剩余单词都被分配给最后一个变量
read -p “Enter a filename: “ FILE
bash如何展开命令行
把命令行分成单个命令词
展开别名
展开大括号种的声明({})
展开波浪符声明(~)
命令替换$() 和 “)
再次把命令行分成命令词
展开文件通配(* 、? 、[abc] 等等)
准备I/0 重导向(< 、>)
运行命令
防止扩展:反斜线(\ )会使随后的字符按原意解释
加引号来防止扩展
? 单引号(’ )防止所有扩展
? 双引号(” )也防止所有扩展,但是以下情况例外:
$ (美元符号) - 变量扩展
` (反引号) - 命令替换
\ (反斜线) - 禁止单个字符扩展
! (叹号) - 历史命令替换
bash的配置文件:
按生效范围划分,存在两类:
全局配置:
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
个人配置:
~/.bash_profile
~/.bashrc
修改profile 和bashrc 文件后需生效
两种方法:
1 重新启动shell 进程
2 . 或source (使用source)
bash退出任务:
保存在~/.bash_logout 文件中(用户)
在退出登录shell 时运行
用于
? 创建自动备份
? 清除临时文件
bash脚本基础