在上一期,我们为大家分享了VIM编辑器的一些应用,具体详情可以点击传送门查看:【誉天红帽入门指南】第六期:VIM编辑器的高级应用。
本期我们继续为大家带来 RHEL 8.0 的知识分享——shell基础。
随着Linux企业应用越来越多,维护Linux日常工作频繁,所以如果单靠手工去敲打命令是非常困难的,所以学会熟练使用SHELL编程来实现自动化运维是每个Linux 系统管理员必备的技能。
Shell是一个命令解释器,它的作用是解释执行用户输入的命令及程序,用户每输入一条命令,Shell就解释执行一条。Shell存在于操作系统的最外层,负责和用户直接对话,把用户的输入解释给操作系统,并处理各种各样的操作系统输出结果 ,然后输出到屏幕返回给用户,而Shell脚本就是命令或程序语句不在命令行下执行,而是通过一个程序文件来执行。
在Linux系统中,Shell脚本通常是使用Vim编辑器进行编写,其内容大多数是命令和程序结构控制语句以及注释构成。其规范的格式如下:
Shell脚本的第一行为指定脚本解释器,通常为:
#/bin/bash 或 #/bin/sh
Shell脚本添加版本和个人信息
# Date: 2020-03-14 05:20
# Author: Yang Feng
# Description: my first script
# Version: 1.0
Shell脚本中尽量不使用中文
Shell脚本的命名应该以.sh为扩展名
Shell脚本应该放在固定的路径下,如/opt/scripts
使用合适的代码缩进规范
Shell编程语言是非类型的解释型语言,不像C++/JAVA语言编程时需要事先声明变量,SHELL给一个变量赋值,实际上就是定义了变量,在Linux支持的所有shell中,都可以用赋值符号(=)为变量赋值。
SHELL变量可分为两类:局部变量和环境变量。局部变量只在创建它们的shell脚本中使用。而环境变量则可以在创建它们的shell及其派生出来的任意子进程中使用。有些变量是用户创建的,其他的则是专用shell变量。
在Linux Shell编程中,if、for等条件流程控制语句用的非常多,把这些学好,对提升脚本的功力有非常大的帮助。下面将逐个来讲解具体的用法:
Ø If条件判断语句
If (表达式) #if ( Variable in Array )
语句1
else
语句2
fi
案例一:测试数字大小
#!/bin/sh
NUM=100
if (( $NUM > 4 )) ;then
echo “this num is $NUM greater 4 !”
fi
案例二:测试目录是否存在,不存在则新建(注意,中括号之间必须要空格)
#!/bin/sh
#judge dir exist
if [ ! -d /data/20200520 ];then
mkdir -p /data/20200520
else
echo “This DIR is exist,Please exit …..”
fi
逻辑运算符解析:
-f 判断文件是否存在 eg: if [ -f filename ]
-d 判断目录是否存在 eg: if [ -d dir ]
-eq 等于,应用于:整型比较
-ne 不等于,应用于:整型比较
-lt 小于,应用于:整型比较
-gt 大于,应用于:整型比较
-le 小于或等于,应用于:整型比较
-ge 大于或等于,应用于:整型比较
-a 双方都成立(and) 逻辑表达式 –a 逻辑表达式
-o 单方成立(or) 逻辑表达式 –o 逻辑表达式
-z 空字符串
案例三:多个条件测试判断
#!/bin/shscores=80;
if [[ $scores -gt 85 ]]; then
echo "very good!";
elif [[ $scores -gt 75 ]]; then
echo "good!";
elif [[ $scores -gt 60 ]]; then
echo "pass!";
else
echo "no pass!";
fi;
Ø 循环语句for
For 变量 in 字符串
do
语句1
done
案例一:打印seq多个数
#!/bin/sh
for i in `seq 15`
do
echo “NUM is $i”
done
案例二:找到相关log,然后批量打包
#!/bin/sh
for i in `find /var/log -name “*.log”`
do
tar –czf 2020log.tgz $i
done
1. 显示用户工作目录、登录用户、家目录、系统时间、备份脚本。
#! /bin/bash
#this is a sample script
echo My current work directory is `pwd`
echo My current login name is $USER,
home directory is $HOME echo My current time is `date '+%Y/%m/%d %H:%M:%S'`
cp -r /etc /backup/etc-$(date +%Y-%m-%d-%H-%M-%S) echo 'backup complate!!!!!!'
2. 备份 sysconfig 文件,附加备份时间并显示备份完成时间。
#! /bin/bash
#this script creates a backup of /etc/sysconfig #into a date stamped subdirectory of ~/backups/
cp -av /etc/sysconfig ~/backups/sysconfig-$(date +%Y%m%d) echo "Backup of /etc/sysconfig completed at: $(date)"
3. 使用 for 循环创建文件列表中用户。
#! /bin/bash
#creat user for userlist
for num in $(cat ~/userlist.txt) do
USERS=$num useradd $USERS
echo "$USERS" | passwd --stdin $USERS done
4. 将/tmp 文件夹中所有文件扩展名改为.doc。
#! /bin/bash
#this is a rename script for files in $(ls /tmp) do
files1=$(echo $files |cut -d '.' -f1) mv /tmp/$files /tmp/$files1.doc
done
5. 检查 vsftpd 服务启动状态脚本。
#!/bin/bash vsftpd=$(pidof vsftpd) if [ -n "$vsftpd" ];then
echo "vsftp is running "
else fi
service vsftpd restart
6. 检查 172.25.254.1~30 这段 IP 地址主机状态是否正常。
#! /bin/bash
#this is a ping test script for num in {1..30}
do
ping -c1 172.25.254.$num &> /dev/null if [ "$?" = 0 ];then
echo "172.25.254.$num is up." else
echo "172.25.254.$num is down."
fi done
7. 比较用户输入的数是否小于、等于、大于 100。
#! /bin/bash
TEST=100
read -p "please input a number :" num if [ $num -lt $TEST ];then
echo "$num
8. 判断/tmp/redhat 文件夹是否存在,并确保拷贝/root/*.txt 到/tmp/redhat 文件夹一定成功。
#! /bin/bash
#this is a copy file script DIR="/tmp/redhat"
if [ -f "$DIR" ];then
rm -rf /tmp/redhat && echo "$DIR file deleted" mkdir $DIR
elif [ -d "$DIR" ]; then
echo "$DIR directory exist" else
mkdir $DIR
fi
cp /root/*.txt $DIR && echo "Copy completed"
9. 检查根分区空间,当空间使用率大小 40%时,发邮件给 user1 用户。
#! /bin/bash
#this is a check disk space script
use=$(df -h|grep -w '/'|awk '{print $5}'|cut -d'%' -f1) num=40
if [ "$use" -gt "$num" ];then
echo "diskspace is >40%."|mail -s 'disk infomation' user1 else
echo "diskspace is<40%." Fi
10. 根据用户提供的用户列表创建用户,并指定创建用户的登录shell。
#!/bin/bash
if [ -z "$1" ];thenecho "Usage: /root/batchusers.sh" exit 1
elif [ -f "$1" ];then
for A in $(cat $1) do
else
done
useradd -s /bin/false $A
echo "Input file not found" exit 2
fi
11. 创建列表中用户,利用随机数字作为用户密码,发用户、密码信息给用户,并将用户、 密码信息导出到一个文件列表中。
#!/bin/bash #create user.
for USERS in $(cat /root/userlist.txt) do
id $USERS >>/dev/null if [ $? = 0 ];then
echo "$USERS already exit" else
useradd $USERS PASSWORD=$(openssl rand -base64 4)
echo "$PASSWORD"|passwd --stdin $USERS
echo "USERNAME: $USERS,PASSWORD: $PASSWORD"|mail -s "username and passowrd"$USERS
echo "USERNAME: $USERS,PASSWORD: $PASSWORD" >>/root/user.txt fi
done
12. 提示用户输入用户名、密码,创建用户脚本,判断用户是否存在,密码是否为空。
#!/bin/bash
#this script is useful to create user.
read -p "Please Input a UserName: " USER id $USER &>/dev/null
if [ $? = 0 ];then
echo "$USER already exist" exit 1
else
useradd $USER
read -p "Please Input a Password: " PASSWD if [ -z $PASSWD ];then
echo "Password is null,Please try on." exit 2
else
echo "$PASSWD"|passwd --stdin $USER
fi
fi