shell编程
Shell Script介绍
概念
Shell脚本是包含一系列命令的文本文件
Shell读取从文件并执行命令
应用场景
重复性操作
批量事物处理
自动化运维
定时任务执行
编写第一个Shell脚本test.sh
创建一个test.sh脚本文件:
[root@hadoop001 shell]# vi test.sh
输入:
#!/bin/bash
echo "Hello World"
保存退出,给脚本赋执行权,运行Shell脚本:
[root@hadoop001 shell]# chmod +x test.sh
[root@hadoop001 shell]# ./test.sh
Hello World
注意:#!是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行
变量
命名规则
只能使用英文字母,数字和_,首字符不能以数字开头。
中间不能有空格,可以使用下划线(_)。
不能使用标点符号。
不能使用bash里的关键字
三种引号
反引号:引用命令的结果
[root@hadoop001 shell]# echo `date`
单引号:强引用,引号中输入什么,输入就是什么
[root@hadoop001 shell]# echo 'date'
双引号:弱引用,可引用变量的值
[root@hadoop001 shell]# echo "$PATH"
变量的定义及使用
变量的定义
创建一个test2.sh文件:
[root@hadoop001 shell]# vi test2.sh
输入:
#!/bin/bash
#定义变量直接赋值
vara=1234
#环境变量可以直接使用
varb=$JAVA_HOME
#直接引用变量
varc=vara
#间接引用
vard=${!varb}
#将23转换为a b c
vare=${vara/23/'a b c'}
#将命令的结果分配给变量
varf=`pwd`
#打印结果
echo $vara
echo $varb
echo $varc
echo $vard
echo $vare
echo $varf
给test2.sh赋权,执行test.sh:
[root@hadoop001 shell]# chmod +x test2.sh
[root@hadoop001 shell]# ./test2.sh
变量运算
#!/bin/bash
a=1
b=2
c=$(($a+$b))
d=$[ $a + $b ]
echo $c
echo $d
预定义变量
选项 | 说明 |
---|---|
$# | 命令行参数或位置参数的数量 |
$? | 最近一次执行的命令或shell脚本的出口状态 |
$* | 表示所有的位置参数,其值是所有位置参数的值 |
$$ | 变量是shell脚本里面的进程ID。Shell脚本经常使用 $$ 变量组织临时文件名,确保文件名的唯一性 |
位置变量
$n:$0代表命令本身,$1-9 代 表 顺 序 参 数 编 号 , 大 于 10 的 话 使 用 括 号 , 如 9代表顺序参数编号,大于10的话使用括号,如9代表顺序参数编号,大于10的话使用括号,如{10}
示例:
[root@hadoop001 shell]# vi test3.sh
输入:
#!/bin/bash
echo 参数个数: $#
echo 所有位置参数: $*
echo '上一句结果(执行成功为0):' $?
echo 进程id: $$
echo 当前命令: $0
echo 第一个参数: $1
echo 第二个参数: $2
给test3.sh赋权,并执行:
[root@hadoop001 shell]# chmod +x test3.sh
[root@hadoop001 shell]# ./test3.sh
Shell数值关系运算符
数值关系运算符
选项 | 说明 |
---|---|
-eq | 等于 |
-ne | 不等于 |
-gt | 大于 |
-lt | 小于 |
-le | 小于或等于 |
-ge | 大于或等于 |
逻辑运算符
选项 | 说明 |
---|---|
-a或&& | 逻辑与 |
-o或ll | 逻辑或 |
! | 逻辑否 |
字符串运算符
选项 | 说明 |
---|---|
= | 等于 |
!= | 不等于 |
-z | 判断是否为空 |
文件运算符
选项 | 说明 |
---|---|
-d | 判断是否为目录 |
-e | 判断目录或文件是否存在 |
-f | 判断是否为文件 |
-r | 判断文件或目录针对当前用户是否可读 |
-w | 判断文件或目录针对当前用户是否可写 |
-x | 判断文件或目录针对当前用户是否可执行 |
流程控制
shell的流程控制不可为空
if选择语句
if语句
if
then
...
fi
if-else语句
if
then
...
else
...
fi
if else-if else语句
if
then
...
elif
then
...
else
...
fi
for循环语句
一般for循环
for var in item1 item2 ... itemN
do
...
done
增强for循环
for(i=0;i<=5;i++)
do
...
done
while循环语句
while condition
do
...
done
until循环语句
until condition
do
...
done
case语句
case 值 in
模式1)
...
;;
模式2)
...
;;
模式*)
...
;;
esac
跳出循环
break命令
break命令允许跳出所有循环(终止执行后面的所有循环)。
continue命令
continue命令仅仅跳出当前循环。
Shell函数
语法如下:
函数名()
{
#函数代码
}
#输入函数名直接调用
函数名
示例如下:
#!/bin/bash
a(){
echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
a
echo "-----函数
TMOUT
TMOUT:在用户输入空闲一段时间后自动断开
#!/bin/bash
TMOUT=3
echo "What is your name?"
echo "You only have $TMOUT seconds to answer!"
read name
if [ $? -eq 0 ]; then
echo "Your name is $name"
else
echo "Timed out!"
exit 1
fi