目录
一、Shell的作用
1.Shell的作用 —— 命令解释器,“翻译官”介于系统内核与用户之间,负责解释命令行
2.用户的登录Shell
2.1登录后默认使用的Shell程序,一般为 /bin/bash
2.2不同Shell的内部指令、运行环境等会有所区别
[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/tcsh
/bin/csh
/bin/ksh
二,编写第一个Shell脚本
1.编写脚本代码
使用vi文本编辑器 每行一条Linux命令,按执行顺序依次编写
[root@localhost ~]# vi first.sh
cd /boot/
pwd
ls -lh vml*
cd /root
(wq存盘后,ls确认当前目录(/root)有first.sh)
2..赋予可执行权限
使脚本具有可执行属性
[root@localhost ~]# ll first.sh (先查文件默认的权限)
[root@localhost ~]# chmod +x first.sh(+x前不写用户或组,默认所有人都给X权)
[root@localhost ~]# ls -l first.sh
-rwxr-xr-x 1 root root 144 04-26 15:02 first.sh
3..执行脚本文件(特殊文件路径:.当前位置,..上级目录)
方法一:脚本文件路径(若在当前位置,不能直接写文件名)
方法二:sh 脚本文件路径
方法三:source 脚本文件路径(先clear,再执行下列命令)
[root@localhost ~]# ./first.sh
/boot
-rw-r--r-- 1 root root 1.8M 2010-03-17 vmlinuz-2.6.18-194.el5
(必须有X权限)
[root@localhost ~]# sh ./first.sh
/boot
-rw-r--r-- 1 root root 1.8M 2010-03-17 vmlinuz-2.6.18-194.el5
(不要求有X权限)
[root@localhost ~]# source ./first.sh
/boot
-rw-r--r-- 1 root root 1.8M 2010-03-17 vmlinuz-2.6.18-194.el5
4. 执行chmod –x first.sh,再运行下面命令,对比结果
[root@localhost ~]# ./first.sh
-bash: ./first.sh: 权限不够
(必须有X权限)
[root@localhost ~]# sh ./first.sh
/boot
-rw-r--r-- 1 root root 1.8M 2010-03-17 vmlinuz-2.6.18-194.el5
(必须有X权限)
[root@localhost ~]# source ./first.sh
/boot
-rw-r--r-- 1 root root 1.8M 2010-03-17 vmlinuz-2.6.18-194.el5
5. 更完善的脚本构成
脚本声明 注释信息 可执行语句
[root@localhost ~]# vi ./first.sh
#!/bin/bash
# This is my first Shell-Script.
cd /boot
echo "当前的目录位于:"
pwd
echo "其中以vml开头的文件包括:" (输出友好提示)
ls -lh vml*
echo "回到本文件存放目录"
cd /root
(wq后,再运行一次上述脚本)
三、重定向与管道操作
1.交互式硬件设备
标准输入:从该设备接收用户输入的数据 (设备文件:/dev/stdin 文件描述编号:0 默认设备:键盘)
标准输出:通过该设备向用户输出数据 (设备文件:/dev/stdout 文件描述编号:1 默认设备:显示器)
标准错误:通过该设备报告执行出错信息 (设备文件:/dev/stderr 文件描述编号:2 默认设备:显示器 )
2.重定向操作
类型:重定向输入 操作符:< 用途:从指定的文件读取数据,而不是从键盘输入
重定向输出 > 将输出结果保存到指定的文件(覆盖原有内容)
重定向输出 >> 将输出结果追加到指定的文件
标准错误输出 2> 将错误信息保存到指定的文件(覆盖原有内容)
标准错误输出 2>> 将错误信息追加到指定的文件中
混合输出 &> 将标准输出、标准错误的内容保存到同一个文件中
3.管道操作符号“|”( 本例用的awk,为文本处理命令)
将左侧的命令输出结果,作为右侧命令的处理对象
格式:cmd1 | cmd2 [... | cmdn]
[root@localhost ~]# grep “bash$” /etc/passwd(先执行clear)
root:x:0:0:root:/root:/bin/bash
teacher:x:500:500:BENET Linux Teacher:/home/teacher:/bin/bash
[root@localhost ~]# grep “bash$” /etc/passwd | awk -F: ‘{print $1,$7}’
root /bin/bash
teacher /bin/bash
四、Shell变量的作用、类型
1.变量的作用
为灵活管理Linux系统提供特定参数,有两层意思:
变量名:使用固定的名称,由系统预设或用户定义
变量值:能够根据用户设置、系统环境的变化而变化
2.变量的类型
自定义变量:由用户自己定义、修改和使用
环境变量:由系统维护,用于设置工作环境
位置变量:通过命令行给脚本程序传递参数
预定义变量:Bash中内置的一类变量,不能直接修改
五、自定义变量
1.定义一个新的变量
格式:变量名=变量值
变量名以字母或下划线开头,区分大小写,建议全大写
2.查看变量的值
格式:echo $变量名
[root@localhost ~]# Product=PPT
[root@localhost ~]# Version=3.0
[root@localhost ~]# echo $Product
PPT
[root@localhost ~]# echo $Product $Version
PPT 3.0
3.赋值时可以使用引号,它们将有如下意义:
双引号:允许通过$符号引用其他变量值
如NEW=“WORD$Version”,将引用上面的变量,结果是WORD3.0
单引号:禁止引用其他变量值,$视为普通字符
当需要用$符号时。如CASH=‘US$IS’
反撇号:命令替换,提取命令执行后的输出结果
如EX=`pgrep –U root | wc –l`,把命令结果赋给EX
4.从键盘输入内容为变量赋值
格式: read [-p “提示信息”] 变量名
如read –p “请输入循环次数:” CISHU
3-2019-19
5.设置变量的作用范围
格式1:export 变量名 ... (已有的变量)
格式2: export 变量名=变量值 ...(新定义的变量)
—— 两种格式可以混合使用
[root@localhost ~]# echo "$Product $Version"
PPT 3.0
[root@localhost ~]# export Product Version
[root@localhost ~]# bash (进入当前工作区的一个子环境,相当于副本)
[root@localhost ~]# echo "$Product $Version"
PPT 3.0
[root@localhost ~]# echo “$EX $CISHU“ (它们则没结果)
[root@localhost ~]# exit (回到主工作区)
[root@localhost ~]# echo “$EX $CISHU“
87 10
6.整数变量的运算(赋值时必须用反撇号`)
格式:expr 变量1 运算符 变量2 [运算符 变量3] ...
7.常用运算符
加法运算:+
减法运算: -
乘法运算: \*
除法运算: /
求模(取余)运算: %
例:echo $EX $CISHU
AK=`expr $EX + $CISHU` (假定read 时输入15)
echo $
例AK=`expr $EX - $CISHU`
echo $AK
例AK=`expr $EX \* $CISHU`
echo $AK
例AK=`expr $EX / $CISHU`
echo $AK
例AK=`expr $EX % $CISHU`
echo $AK
六、 特殊的Shell变量
1.环境变量
由系统提前创建,用来设置用户的工作环境
配置文件: /etc/profile、~/.bash_profile
2.常见的环境变量:
[root@localhost ~]# echo $PATH
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]# PATH=“$PATH:/root” (添加一下新路径/root)
[root@localhost ~]# echo $PATH
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/root
3.位置变量
表示为 $n,n为1~9之间的数字,超过9则用${n}
[root@localhost ~]# ./myprog.sh one two three four five six
[root@localhost ~]# cat myprog.sh
echo “字母表第5个字母是:” $5
echo “字母表第18个字母是:” ${18}
[root@localhost ~]# sh myprog.sh {a..z}
字母表第5个字母是:e
字母表第18个字母是:r
4.预定义变量
[root@localhost ~]# cat mybak.sh
#!/bin/bash
TARFILE=beifen-`date +%Y%m%d`.tgz
tar zcf $TARFILE $* &> /dev/null
echo "已执行 $0 脚本,"
echo "共完成 $# 个对象的备份"
echo “具体内容包括: $*”
[root@localhost ~]# sh mybak.sh /etc/passwd /etc/shadow
已执行 ./mybak.sh 脚本,
共完成 2 个对象的备份
具体包括:/etc/passwd /etc/shadow
[root@localhost ~]# ls *.tgz
beifen-20181008.tgz
七、Shell脚本与计划任务
1.脚本应用思路
确定命令操作(设计并执行任务)
编写Shell脚本(组织任务过程)
设置计划任务(控制时间,调用任务脚本)
[root@localhost ~]# mysqldump -u operator ……
……
[root@localhost ~]# vi /opt/qnzx_dbbak/qnzx_dbbak.sh
#!/bin/bash
……
[root@localhost ~]# crontab -e
30 2 * * * /opt/qnzx_dbbak/qnzx_dbbak.sh
八、编写并使用Shell脚本
1.编写脚本程序welcome.sh
验证登录时的欢迎效果
编写脚本程序status、start、stop
#cd /bin
#vi status
systemctl status $1
#chmod +x status
#status atd(以前面用过的一次性任务服务为例)
其余2个脚本把红色单词换成start或stop即可。
stop atd(假定已完成该脚本)
status atd(显示该已dead)
start atd(假定已完成该脚本)
status atd(显示该正在running)