SHELL概述
Shell Script ,Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比Windows下的批处理更强大,比用其他编程程序编辑的程序效率更高,它使用了Linux/Unix下的命令。
文章目录
Shell脚本应用场景
重复性操作
交互性任务
批量处理
监控服务的运行状态
定时任务执行
用户登录的shell,登录后默认使用的shell程序一般为 /bin/bash
不同的Shell的内部指令,运行环境等会有区别
[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
Shell脚本的初次编写
创建shell脚本
使用 vim 文本编辑器
输入的每一行 Linux命令,会由上到下一次开始
[root@localhost ~]# vim jiaoben.sh
#! /bin/bash //开头声明环境
cd /mnt
touch shiyan
ls
pwd
ls -lh shi*
~
:wq
脚本执行
脚本执行有三种方法
方法一:sh 脚本文件路径
[root@localhost /]# mkdir wenjianjia
[root@localhost /]# mv jiaoben.sh /wenjianjia/
[root@localhost /]# sh /wenjianjia/jiaoben.sh
shiyan
/mnt
-rw-r--r--. 1 root root 0 7月 15 19:03 shiyan
[root@localhost /]#
方法二:source 脚本文件路径
[root@localhost /]# source /wenjianjia/jiaoben.sh
shiyan
/mnt
-rw-r--r--. 1 root root 0 7月 15 19:05 shiyan
[root@localhost mnt]# ///可以看到这种方法执行后,会切换到脚本内切换的目录,这是细节!切记!!!
方法三:直接输入脚本的文件路径
[root@localhost /]# /wenjianjia/jiaoben.sh
-bash: /wenjianjia/jiaoben.sh: 权限不够 ///可以发现这种方法是不能直接执行的,需要基于X权限
[root@localhost /]# chmod +x /wenjianjia/jiaoben.sh
[root@localhost /]# /wenjianjia/jiaoben.sh
shiyan
/mnt
-rw-r--r--. 1 root root 0 7月 15 19:08 shiyan
[root@localhost /]# ///执行后不切文件夹
完善脚本
脚本编写有些时候会发送给别人使用,这时候有一些语句别人看的时候可能会有些疑惑,就可以添加注释语句
[root@localhost /]# vim wenjianjia/jiaoben.sh
#! /bin/bash
echo "切换到 /mnt 目录"
cd /mnt
echo "创建新文件 shiyan"
touch shiyan
echo "查看当前内容"
ls
echo "当前所在位置"
pwd
echo "以人性化的方式列出 shi开头的文件"
ls -lh shi*
接下来再次执行该脚本文件
注:" "内输入字符串
交互式硬件设备
标准输入:从该设备接收用户输入的数据
标准输出:通过该设备向用户输出数据
标准错误:通过该设备报告执行出错信息
重定向符号
来吧!举例!
符号
[root@localhost mnt]# cd /wenjianjia/
[root@localhost wenjianjia]# touch 1
[root@localhost wenjianjia]# echo "这里是内容" > 1
[root@localhost wenjianjia]# cat 1
这里是内容
[root@localhost wenjianjia]# echo "zhelisineirong" > 1
[root@localhost wenjianjia]# cat 1
zhelisineirong
会发现这里第二次输入的内容直接覆盖了原来的内容
>> 符号
[root@localhost wenjianjia]# echo "增加的内容" >> 1
[root@localhost wenjianjia]# cat 1
zhelisineirong
增加的内容
2> 符号
[root@localhost wenjianjia]# touch 4
[root@localhost wenjianjia]# cat 3 2> 4 ///没有创建文件3
[root@localhost wenjianjia]# cat 4
cat: 3: 没有那个文件或目录
别的你们自己试试吧!!!
管道符号 |
进行 | 左边的命令 ,|右边进行二次处理在输出
[root@localhost wenjianjia]# cat /etc/passwd | grep "root"
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost wenjianjia]#
变量
变量的作用
用来存放系统和用户需使用的特定值
变量名:固定名称,由系统预设或者用户自定义
变量值:根据特定用户设置或者根据系统变化而变化
注:变量值存放在内存中(内存条!),所以重启就没了
系统预设的变量不能修改
不变的量叫常量
变量的类型
自定义变量:由用户自定义,修改和使用
特殊变量:环境变量、只读变量、位置变量、预定义变量
定义一个新变量
变量名以字母或者下划线开头,区分大小写,建议统一大小写,以免记错了!
查看变量值,输入 echo $变量名
[root@localhost /]# blm=80
[root@localhost /]# echo $blm
80
注:
变量数据类型
数值
整形 int 4字节 例如:0 1 10 1001
浮点型 float 单精度付点 4字节
Double 双精度浮点 8字节
例如: 10.1 3.14 10.0 有小数点就是浮点型
非数值
字符 char 1字节或2字节 英文一个字节 中文两个字节 字符集问题 支持文 UTF-8
‘a’ ’z‘ 一个字符 ’男‘ ’女‘ 也是一个字符 JAVA语言中的 字母 占两字节
空格也算字符
字符串 字符的集合 无固定长度 在语言中一般使用 “” 字符串的处理规则 正则表达式 处理字符规则
布尔 true成立 false不成立 判断条件成立与否 流程控制语句 条件语句 循环语句
枚举 限定值的范围 颜色 枚举不可以取小数点
变量赋值时的引号
双引号:允许通过 $ 符号引用其他变量值
[root@localhost /]# aaa="wb $blm"
[root@localhost /]# echo $aaa
wb 80
单引号:禁止引用其他变量值
[root@localhost /]# bbb='$blm'
[root@localhost /]# echo $bbb
$blm
反撇号:在键盘左上角,和波浪按钮是一个键 命令替换,提取命令执行后的输出结果
[root@localhost /]# cat sh
123
[root@localhost /]# ccc=`cat sh`
[root@localhost /]# echo $ccc
123
还有种方法
[root@localhost /]# cat sh2
asdfghjkl
[root@localhost /]# ccc=$(cat sh2)
[root@localhost /]# echo $ccc
asdfghjkl
从键盘输入内容为变量赋值
[root@localhost /]# read -p "输入个内容:" ddd
输入个内容:abcdefg
[root@localhost /]# echo $ddd
abcdefg
设置变量的作用范围
Export 声明全局变量
[root@localhost ~]# aaa=bl234
[root@localhost ~]# bbb=bl345
[root@localhost ~]# export aaa
[root@localhost ~]# bash //切换bash变量
[root@localhost ~]# echo $aaa
bl234
[root@localhost ~]# echo $bbb
[root@localhost ~]# exit
exit
[root@localhost ~]# echo $bbb
bl345
整数变量的运算
格式:expr 变量一 运算符号 变量二
常用运算符号
加号:+
减号:-
乘号:*
除号:/
取余:%
[root@localhost ~]# expr 1 + 2
3
[root@localhost ~]# expr 1 - 2
-1
[root@localhost ~]# expr 1.1 + 2.2
expr: 非整数参数
[root@localhost ~]# expr 1 \* 5
5
[root@localhost ~]# one=1
[root@localhost ~]# two=2
[root@localhost ~]# five=5
[root@localhost ~]# he=`expr $one + $two`
[root@localhost ~]# echo $he
3
[root@localhost ~]# quyu=`expr $five % $two`
[root@localhost ~]# echo $quyu
1
环境变量
是系统提前创建的,用来设置用户的工作环境
配置文件:/etc/profile ~/.bash_profile
常见预定义变量:
$0:保存当前程序或脚本的名称
$*:保存传递给脚本或进程的所有参数
$$:当前进程给脚本的PID号
$!:后台运行的最后一个进程的PID号
$?:用于返回上一条命令是否成功执行。如果成功执行,将返回数字0,否则返回非零数字(通常情况下都返回数字1)。
$#:用于保存脚本的参数个数
常见的环境变量
PWD PATH
USER SHELL HOME
只读变量
用于变量值不允许被修改的情况
[root@localhost ~]# zd=bng
[root@localhost ~]# readonly zd
[root@localhost ~]# zd=gl
-bash: zd: 只读变量
[root@localhost ~]# unset zd
-bash: unset: zd: 无法反设定: 只读 variable
位置变量
表示为 $n,n为1-9之间的数字
[root@localhost ~]# mkdir jiaoben
[root@localhost ~]# cd jiaoben/
[root@localhost jiaoben]# vim ys.sh
#!/bin/bash
read -p "请输入第一个整数:" a
read -p "请输入第二个整数:" b
he=`expr $a + $b`
echo "两数之和为:$he "
用位置变量可以这么写
[root@localhost jiaoben]# vim wz.sh
#!/bin/bash
sum=`expr $1 + $2`
echo "所得和为$sum"
[root@localhost jiaoben]# source wz.sh 1 2
所得和为3
[root@localhost jiaoben]# source wz.sh 5 4
所得和为9
再来来一个直接点的
[root@localhost jiaoben]# vim zs.sh
#!/bin/bash
echo "所输入数字为:$1 $2 $3 $4 $5"
[root@localhost jiaoben]# source zs.sh 5 6 7 8 9
所输入数字为:5 6 7 8 9
敲着玩的
[root@localhost jiaoben]# vim zj.sh
#!/bin/bash
read -p "请输入第一个数字:" a
read -p "请输入第二个数字:" b
read -p "请输入第三个数字:" c
jiafa=`expr $a + $b + $c`
ji=`expr $a \* $b \* $c`
echo "所输入的三个数字为:$a $b $c"
echo "所得之和为:$jiafa"
echo "所得的积为:$ji"
echo "所得之和答案: " `expr $a + $b + $c`