玖叶教程网

前端编程开发入门

「誉天红帽入门指南」第七期:SHELL基础

在上一期,我们为大家分享了VIM编辑器的一些应用,具体详情可以点击传送门查看: 「誉天红帽入门指南」第六期:VIM编辑器的高级应用

本期我们继续为大家带来 RHEL 8.0 的知识分享——shell基础。

随着Linux企业应用越来越多,维护Linux日常工作频繁,所以如果单靠手工去敲打命令是非常困难的,所以学会熟练使用SHELL编程来实现自动化运维是每个Linux 系统管理员必备的技能。


一、什么是Shell?

Shell是一个命令解释器,它的作用是解释执行用户输入的命令及程序,用户每输入一条命令,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的变量

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/sh
scores=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 <100!!!" elif [ $TEST -eq $num ];then
echo "$num =100!!!" else
echo "$num >100!!!"
fi


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" ];then
echo "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

欢迎点赞转发~

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言