4_ Vim 编辑器与 Shell 命令脚本(RHEL7)–学习笔记
4.1 #Vim 文本编辑器
:w 保存
:q 退出
:q! 强制退出(放弃对文档的修改内容)
:wq! 强制保存退出
:set nu 显示行号
:set nonu 不显示行号
:命令 执行该命令
:整数 跳转到该行
:s/one/two 将当前光标所在行的第一个 one 替换成 two
:s/one/two/g 将当前光标所在行的所有 one 替换成 two
:%s/one/two/g 将全文中的所有 one 替换成 two
?字符串 在文本中从下至上搜索该字符串
/字符串 在文本中从上至下搜索该字符串
4.2 #编写 Shell 脚本
vim example.sh
bash example.sh
./example.sh #需要权限
#接收用户的参数
# $0 对应的是当前 Shell 脚本程序的名称,
# $# 对应的是总共有几个参数,
# $* 对应的是所有位置的参数值,
# $? 对应的是显示上一次命令的执行返回值,
# $1、$2、$3……则分别对应着第 N 个位置的参数值
#!/bin/bash
echo "当前脚本名称为$0"
echo "总共有$#个参数,分别是$*。 " //# $# $* $?
echo "第 1 个参数为$1,第 5 个为$5。"
sh example.sh one two three four five six
#判断用户的参数
-d 测试文件是否为目录类型
-e 测试文件是否存在
-f 判断是否为一般文件
-r 测试当前用户是否有权限读取
-w 测试当前用户是否有权限写入
-x 测试当前用户是否有权限执行
[ -d /etc/fstab ]
echo $? #返回值为 0,则目录存在;如果返回值为非零的值,则意味着目录不存在
[ -e python.txt ]
[ -f /etc/fstab ]
[ -r /etc/fstab ]
[ -w /etc/fstab ]
[ -x /etc/fstab ]
[ -e /dev/cdrom ] && echo "Exist" # YES && 执行
[ $USER = root ] || echo "user" # NO || 执行
[ ! $USER = root ] && echo "user" || echo "root"
#可用的整数比较运算符
-eq 是否等于
-ne 是否不等于
-gt 是否大于
-lt 是否小于
-le 是否等于或小于
-ge 是否大于或等于
[ 10 -eq 10 ] =
[ 1 -ne 2 ] /=
[ 2 -gt 1 ] >
[ 2 -ge 1 ] >=
[ 1 -lt 2 ] <
[ 1 -le 2 ] =<
FreeMem=`free -m | grep Mem: | awk '{print $4}'`
[ $FreeMem -lt 1024 ] && echo "Insufficient Memory"
#常见的字符串比较运算符
#用来判断某个变量是否未被定义(即内容为空值)
= 比较字符串内容是否相同
!= 比较字符串内容是否不同
-z 判断字符串内容是否为空
[ -z $String ]
[ $LANG != "en.US" ] && echo "Not en.US"
4.3 #流程控制语句bash#if 语句分为单分支结构
if 条件测试操作
then 命令序列
fi
#判断/media/cdrom 文件是否存在,若存在就结束条件判
#断和整个 Shell 脚本,反之则去创建这个目录
#!/bin/bash
DIR="/media/cdrom"
if [ ! -e $DIR ]
then
mkdir -p $DIR
fi
#if 双分支结构
if 条件测试操作
then 命令序列1
else 命令序列2
fi
#验证某台主机是否在线,然后根据返回值的结果,要么
#显示主机在线信息,要么显示主机不在线信息
#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &>> /dev/null
if [ $? -eq 0 ]
then
echo "Host $1 is On-line."
else
echo "Host $1 is Off-line."
fi
#if 多分支结构
if 条件测试操作1
then 命令序列1
elif 条件测试操作2
then 命令序列2
else
命令序列3
fi
#使用多分支的 if 条件语句来判断用户输入的分数在哪个成绩区间内,然后输出如
#Excellent、 Pass、 Fail 等提示信息
#!/bin/bash
read -p "Enter your score (0-100):" GRADE
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] ; # 85=<X<=100
then
echo "$GRADE is Excellent"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ] ; ## 70=<X<=84
then
echo "GRADE is Pass"
else
echo "$GEADE is Fail"
fi
#for 条件循环语句
for 变量名 in 取值列表
do
命令序列
done
#在脚本中使用 read 命令读取用户输入的密码值,然
#后赋值给 PASSWD 变量,并通过-p 参数向用户显示一段提示信息,告诉用户正在输入的内容
#即将作为账户密码。在执行该脚本后,会自动使用从列表文件 users.txt 中获取到所有的用户
#名称,然后逐一使用“id 用户名”命令查看用户的信息,并使用$?判断这条命令是否执行成
#功,也就是判断该用户是否已经存在。
#!/bin/bash
read -p "Enter The Users Password : " PASSWD
for UNAME in 'cat users.txt'
do
id $UNAME &> /dev/null
if [ $? -eq 0 ]
then
echo "Already exists"
else
useradd $UNAME &> /dev/null
echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null
if [ $? -eq 0 ]
then
echo "$UNAME, Create success"
else
echo "$UNAME, Create failure"
fi
fi
done
#!/bin/bash
HLIST=$(cat ~/ipadds.txt) #执行括号或双引号括起来的字符串中的命令
for IP in $HLIST #类似于转义字符中反引号`命令`的 Shell 操作符
do
ping -c 3 -i 0.2 -W 3 $IP &> /dev/null
if [ $? -eq 0 ] ; then
echo "Host $IP is On-line."
else
echo "Host $IP is Off-line."
fi
done
#while 条件循环语句
while 条件测试操作
do
命令序列
done
#!/bin/bash
PRICE=$(expr $RANDOM % 1000)
TIMES = 0
echo "Price is between 0-999 ,Guess what?"
while true #while 条件循环语句中的条件测试始终为 true,
#因此判断语句会无限执行下去,直到用户输入的数
#值等于 expr 命令取得的数值后,
#这两者相等之后才运行 exit 0 命令,终止脚本的执行
do
read -p "Please Enter the price" INT
let TIMES++
if [ $INT -eq $PRICE ] ;
then
echo "YES ,Price is $PRICE"
echo "$TIMES"
exit 0
elif [ $INT -gt $PRICE ] ;
then
echo "High"
else
echo "Low"
fi
done
bash Guess.sh
4.4 #计划任务服务程序
#一次性计划任务:
at 23:30
at > systemctl restart httpd
at > 此处请同时按下 Ctrl + D 组合键来结束编写计划任务
echo “systemctl restart httpd” | at 23:30
at -l #查看已设置好但还未执行的一次性计划任务
atrm 任务序号 #将其删除
#长期性计划任务
crontab -e # 来创建计划任务,打开vim编辑器
crontab -l # 查看当前计划任务的命令
crontab -r # 删除某条计划任务
crontab -u # -u 参数来编辑他人的计划任务
whereis rm # rm 命令路径
而“日”和“星期”字段不能同时使用
25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot
分 时 日 月 星期 命令绝对路径 目标名称 被打包文件夹
25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot
0 1 * * 1-5 /usr/bin/rm -rf /tmp/*