1.BASH脚本基础
BASH = GNU Bourne-Again Shell,BASH 是 GNU 组织开发和推广的一个项目。
Bash脚本类似批处理,简单来讲就是把许多的指令集合在一起,并提供循环、条
件、判断等重要功能,语法简单实用,用以编写程序,大大简化管理员的操作,并可以
完成图形工具所无法实现的功能。
2.如何创建心shell脚本
1)创建包含bash命令的文本文件。文件的第一行应为:
#!/bin/bash
2)使文件可执行(使用chmod +x scripts)
3) 将文件放置在用户的$PATH的目录中
~/bin – 用于用户的私有程序
/usr/local/bin – 本地开发、系统上的其他人使用的脚本
/usr/local/sbin – 本地开发、由root使用的脚本
直接运行脚本和使用source命令运行脚本是不同的!
脚本调试模式:
#!/bin/bash -x
# bash -x scripts
3.引用和转义
引用和转义在shell解析字符串时用于去除字符串中特殊字符或保留词语的特殊含义。这会导致按字
面处理字符串,而不是展开变量或将其部分内容视作具有特殊含义。
引用有三种类型:
(1)
弱引用
将字符串放置在双引号中,保留字符串中所有字符的文字值,$、
1 | 1` |
、\和!字符除外。换言之,变量
扩展和命令扩展在双引号内仍起作用。
echo “can I have a $FRUIT”
echo “The current time is $(date +%r).”
(2)
强引用
将字符串放置在单引号中,保留字符串中所有字符的文字值,同时禁用所有扩展:
echo “Make $$$ Fast”
rm 'untitled folder'
(3)
转义
非引用的\是转义字符。它保留了下一个字符的文字值。(例如,$PATH是确切的字符串$PATH,而
不是PATH变量的内容。)
echo Make $$$ Fast!
ls untitled\ folder
4.Shell变量
shell变量用于为稍后在脚本中使用的名称指定值,并且仅限于shell命令行或从中声明变
量的脚本。
测试:
5.命令替换
命令替换在子shell中执行指定命令并用命令输出替换脚本中的命令替换。
6.Shell计算命令
算数运算符指的是可以在程序中实现加减乘除等数学运算的运算符。
计算命令:
(1)用$[]表示数学运算。
# echo $[1+2]
# a=1; echo $[$[$a+1]*2]
(2)用expr表示数学运算。
# echo
1 | 1` |
expr 1 + 2
1 | 1` |
(3)用let指示数学运算。
# let A=1+2
# echo $A
(4)用(())表示数学运算。bash内建功能,效率高。
#!/bin/bash
for ((i=1;i<10;i++))
do
((j+=i))
done
echo $j
测试:
7.循环
for循环用于值列表中的相同命令的重复。
8.Bash位置参数
有两种简单的方法可以将用户输入读入bash中的变量。第一个方法是使用read提示用
户输入(使用-p选项)并将其直接存储到一个或多个变量:
交互式输入
# read -p 'Enter your first and last name: ' FIRST LAST
测试:
另一个方法是使用位置参数来读取传递给脚本的命令行参数或选项输入。各种特殊
变量存储传递的选项编号
Bash解析的个别参数或整个原始命令行。
指定的位置参数总数:$#
位置参数自身:$0、$1、$2、$3….
所有位置参数: $@、$*
编写脚本test.sh
测试:
9.退出状态
Linux命令完成时,将返回退出状态。成功完成程序时,将返回0的推出状态。这被bash
当作逻辑True值。非零退出状态通常表示发生了错误,并且被bash当作逻辑False值。
例如:grep的退出状态的含义:
0 – 在指定的文件中找到了模式
1 – 在指定的文件中未找到模式
1 – 一些其他错误(无法打开文件、错误的搜索表达式等)
推出状态的值被存储在"?"中,可以使用以下命令查看:
# echo $?
10.test条件判断
test命令可用于评估bash脚本中的表达式。它评估其参数所指定的表达式,如果表达式
为true,返回零退出状态,如果表达式为false,则返回非零退出状态。test具有替代语
法,使用方括号"[]"将表达式括起来,这样更易于阅读。
语法:test EXPRESSION 或 [EXPRESSION]
非零或零长度字符串运算符:test -{n|z} STRING
[root@server0 ~]# [ -n westos ]; echo $?
0
[root@server0 ~]# [ -z westos ]; echo $?
1
11.字符串比较运算符:=、!=
数字比较运算符:-eq(equal)、-ne(not equal)、-lt(less than)、-le(less or equal)、-gt(greater than)、-ge(greater or equal)
12.文件状态运算符:test -{b|c|e|f|d|r|w|x|s|L} FILE/DIRECTORY
-b ##block
-c ##charcter
-e ##exist
-f ## exist and regular
-d ##directory
-r ##regular
-L ##link
13.二进制文件运算符
-ef ##是否相同
-nt ##第一个文件比第二个文件新
-ot ##第一个文件比第二个文件旧
14.逻辑运算符
-o ##或
-a ##且
! ##结果取反
&& ##结果正确则执行
|| ##结果错误则执行
15.if语句
if命令检查if后面的命令或列表的退出值。如果第一个命令评估为true/零,则运行then
之后的命令列表,直至任一else。如果第一个命令评估为false/非零,则运行else与fi之
间的命令列表(反向平写if,标记if块的结束)。
语法:if command; then command; command2; else command3; fi
测试:
16.while语句
同if检查命令或列表的退出值然后寻找匹配项执行
测试:
17.case语句
case语句
case语句 :它能够把变量的内容与多个模板进行匹配,再根据成功匹配的模板去决定应该执行哪
部分代码。
case "$1" in
start)
systemctl start $2
;;
stop)
systemctl stop $2
;;
reload|restart)
systemctl stop $2
systemctl start $2
;;
*)
echo "Usage: $0 (start|stop|restart|reload)"
;;
esac
18.expect语句
在shell中利用expect实现自动应答脚本。
#!/usr/bin/expect
这一行告诉操作系统脚本里的代码使用那一个shell来执行。
set timeout 10
设置后面所有的expect命令的等待响应的超时时间,单位为秒。
spawn talk
spawn是expect的内部命令,作用是给后面的shell指令加个壳,用来传递交互指令。
expect "who"
判断上次输出结果里是否包含“who”的字符串,如果有则立即返回,否则等待超时时间后返回。
send "westos\n"
执行交互动作,相当于手工输入"westos"。
expect eof
作用是在输出中搜索文件结束符,如果没有这一行,脚本会立即退出,得不到正确结果。
interact
执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。否则退出登录。
$argv 参数数组
expect脚本可以接受从bash传递过来的参数.可以使用[lindex $argv n]获得,n从0开始,分别表示第
一个,第二个,第三个….参数。
试验前需安装expect
交互输入脚本
expect自动应答脚本
测试:
expect脚本从bash传递过来的参数:
[ lindex #argv n] ##n从0开始,即脚本后所跟的第一个数
测试:
19.ACTION函数
通过使用函数可以减少编写脚本中大量的代码字符,使编写脚本更为便捷
##ACTION函数中的$1、$2等等变量都代表在脚本中使用函数后所跟参数,而不是运行脚本时后所跟参数
20.环境变量
shell和脚本使用变量来存储数据 ,有些变量可以连同它们的内容传递给子进程,这些
变量我们称之为环境变量。
(1)临时设置
(2)用户级别设置
对应用户生效,切换用户后不生效。
export a=1 ##即在该用户使用时a=1生效
测试:
(3)系统级别
切换用户后也生效
export a=1 ##在/etc/profile下系统级别修改,永久生效
测试:
(4)env
查看环境变量
20.使用别名
alias命令可以用来自定义属于自己的系统命令,写入~/.bashrc 文件永久生效。
(1)临时生效
alias kan='cat'
alias ##查看别名
(2)永久生效
修改.bashrc文件使别名永久生效
添加alias kan='cat'
测试:
(3)删除别名
unalias kan ##即删除了别名