什么是脚本:
一个可以执行文件,可以实现某种功能
人:创建用户tom 计算机:useradd tom
规范Shell脚本的一般组成
• #! 环境声明,声明以下所有的代码有谁进行翻译
• # 注释文本
• 可执行代码
[root@server0 ~]# vim /root/hello.sh
#!/bin/bash
echo hello world
cat /etc/redhat-release
uname -r
hostname
ifconfig | head -2
[root@server0 ~]# /root/hello.sh
重定向输出
>:只收集前面命令的正确信息
2>:只收集前面命令的错误信息
&>:正确与错误都收集
[root@server0 ~]# echo 123 > /opt/1.txt [root@server0 ~]# cat /opt/1.txt [root@server0 ~]# cat /opt/1.txt /a
[root@server0 ~]# cat /opt/1.txt /a > /mnt/b.txt [root@server0 ~]# cat /mnt/b.txt
[root@server0 ~]# cat /opt/1.txt /a 2> /mnt/b.txt [root@server0 ~]# cat /mnt/b.txt
[root@server0 ~]# cat /opt/1.txt /a &> /mnt/b.txt [root@server0 ~]# cat /mnt/b.txt
为了适应多变的需求与多变环境,所以使用变量
使用变量:会变化的量 类似于容器 以不变的名称,存储可以变化的值
变量名=存储的值
降低脚本运行难度,产生交互,获取到用户输入的内容
read -p '屏幕输出信息'
1.产生交互
2.记录用户在键盘上所有的输入
3.将用户在键盘上所有的输入,赋值给一个变量储存
• 设置变量时的注意事项
– 若指定的变量名已存在,相当于为此变量重新赋值
– 等号两边不要有空格
– 变量名只能由字母/数字/下划线组成,区分大小写
– 变量名不能以数字开头,不要使用关键字和特殊字符
查看/引用变量
• 基本格式
– 引用变量值:$变量名
– 查看变量值:echo $变量名、echo ${变量名}
[root@server0 ~]# a=rhel [root@server0 ~]# echo $a
[root@server0 ~]# echo $a7
[root@server0 ~]# echo ${a}7
[root@server0 ~]# a=CentOS
[root@server0 ~]# echo ${a}7
补充:
单引号 '' : 取消所有特殊字符的意义
[root@server0 ~]# echo '' * [root@server0 ~]# echo ' ? | '
-
? | [root@server0 ~]# a=10 [root@server0 ~]# echo $a 10 [root@server0 ~]# echo '$a' $a [root@server0 ~]#
变量的种类 环境变量: 变量名一般都大写,用来设置用户/系统环境 由系统定义完成,并且赋值完成 常见的环境变量: USER=存放当前系统登陆的用户名
[root@server0 ~]# echo $USER root [root@server0 ~]# su - dc [dc@server0 ~]$ echo $USER dc [dc@server0 ~]$ exit logout [root@server0 ~]# su - student [student@server0 ~]$ echo $USER student [student@server0 ~]$ exit logout [root@server0 ~]#
PATH=提供命令程序搜寻的路径
[root@server0 ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@server0 ~]# vim /opt/hello.sh echo I Love Dc [root@server0 ~]# chmod +x /opt/hello.sh [root@server0 ~]# /opt/hello.sh I Love Dc [root@server0 ~]# hello.sh bash: hello.sh: 未找到命令...
[root@server0 /]# cp /opt/hello.sh /usr/bin/ [root@server0 /]# hello.sh
位置变量:非交互式传递命令行参数
• 在执行脚本时提供的命令行参数
– 表示为 $n,n为序号
– $1、$2、.. .. ${10}、${11}、.. ..
预定义变量
• 用来保存脚本程序的执行信息
– 直接使用这些变量
– 不能直接为这些变量赋值
$# 已加载的位置变量的个数,专门用于判断用户是否输入命令行参数
$? 程序退出后的状态值,0表示正常,其他值异常
[root@server0 ~]# vim /root/1.sh #!/bin/bash echo $1 echo $2 echo $3 echo $# [root@server0 ~]# /root/1.sh haha xixi hehe lele
[root@server0 ~]# vim /root/3.sh #!/bin/bash echo 您一共输入了$#个参数 [root@server0 ~]# chmod +x /root/3.sh [root@server0 ~]# /root/3.sh [root@server0 ~]# /root/3.sh hehe lele
条件测试及选择
条件测试
– [ 测试表达式 ] #每一部分之间都要有空格
常用的测试选项
• 检查文件状态
-e:数据存在才为真
-d:数据存在,并且必须为目录才为真
-f:数据存在,并且必须为文件才为真
[root@server0 ~]# [ -f /etc/passwd ] [root@server0 ~]# echo $? 0[root@server0 ~]# [ -d /etc/passwd ] [root@server0 ~]# echo $? 1 [root@server0 ~]# [ -d /etc ] [root@server0 ~]# echo $? 0[root@server0 ~]# [ -e /abc ] [root@server0 ~]# echo $? 1
• 比较整数大小
-gt:大于
-ge:大于或等于
-eq:等于
-ne:不等于
-lt:小于
-le:小于或等于
[root@server0 ~]# [ 1 -eq 1 ] [root@server0 ~]# echo $? 0[root@server0 ~]# [ 2 -ge 1 ] [root@server0 ~]# echo $? 0[root@server0 ~]# [ 2 -ge 2 ] [root@server0 ~]# echo $? 0[root@server0 ~]# [ 2 -gt 2 ] [root@server0 ~]# echo $? 1
• 字符串比对
==:两个字符串一致为真
!=:两个字符串不一致为真
[root@server0 ~]# [ student == haha ] [root@server0 ~]# echo $? 1 [root@server0 ~]# [ root == $USER ] [root@server0 ~]# echo $? 0[root@server0 ~]# [ student != haha ] [root@server0 ~]# echo $? 0[root@server0 ~]#
if选择结构
if双分支处理
if [条件测试];then
命令序列xx
else
命令序列yy
fi
if多分支处理
if [条件测试1];then
命令序列xx
elif [条件测试2];then
命令序列yy
elif [条件测试3];then
命令序列hh
else
命令序列zz
fi
for循环结构,解决重复性的操作
• 遍历/列表式循环
– 根据变量的不同取值,重复执行xx处理
for 变量名 in 值列表
do
反复执行的代码