cd /opt //在此目录下写脚本 opt垃圾目录

shell只能执行非交互式命令

编写第一个shell脚本

#!/bin/bash
#这是一个测试脚本
echo  ok
echo  hello world

在root用户下增加执行权限

chmod +x test.sh

bash test.sh 或 sh test.sh

在shell脚本下载ftp并设置自启动

#!/bin/bash
#安装ftp并设置自启动
dnf  install  -y  vsftpd  &>  /dev/null (黑洞 将命令结果丢进黑洞)     

&> 重定向所有输出 >覆盖 >>追加

变量名字数字、字母、下划线 不能以数字开头,区分大小写,等号两边不能有空格

a=10 
echo ${a}RMB    #a是变量   RMB是常量  调用变量时为了防止混淆,通常给变量加上{}
删除变量
unset a 

环境变量

echo  $USER   #当前登录用户
echo  $PATH   #系统环境变量
echo  $UID    #当前系统用户UID
echo  $SHELL
echo  $PWD
echo  $PS1   一级提示符  修改前边输入头命令
echo  $PS2   二级提示符  多行输入命令  如ls  \   换到下一行继续输入

未知变量

#!/bin/bash
echo $1  #打印输入的第一个变量
echo $2  #打印输入的第二个变量
echo $3  #打印输入的第三个变量
echo $0  #打印输入脚本名称
echo $*  #打印全部内容
echo $#  #打印个数
echo $$  #打印程序执行进程号,目的是当某个程序不想要了,通过kill  -9  杀死进程
echo $?  #打印上一条任务是否执行成功  0是成功  其他数字是失败

练习

#!/bin/bash

useradd  tom    #创建用户
echo 123456 |  sudo  passwd  --stdin tom    #交互式设置用户密码

echo ---------------------------------------

useradd  $1
echo $2 |  sudo  passwd  --stdin  tom  

变量扩展(引号)

# 引号      
a=" 10"
echo $a   #结果10
echo "$a"  #结果 10         #双引号  保留变量格式
echo "  $a"  #结果   10
echo  '$a'   #结果$a        #单引号  屏蔽特殊符号的作用

read

read  -p  -t 10  "请输入用户名:" u
read  -p  -t 10  "请输入用户密码:" n
useradd $u
echo $n  |  sudo  passwd  --stdin tom 

stty -echo 作用:输入密码时进行隐藏

临时变量

#set输出所有全局变量和局部变量(如:shell脚本文件中定义的变量)
#env只显示全局变量
#定义临时用户环境变量
TABA=100
#定义临时全局变量环境
export  TABA=100

运算(符号两边要加空格)

expr  1 + 1  加
expr  1 - 1  减
expr  2 \* 2 乘
expr  2 / 2  初
expr  4 % 3  取余
echo ---------------------------------
a=$[2+3]
echo $a       #  结果5
echo $[2+3]   #  结果5
a=10
b=20
echo $[a+b]   # 结果30
echo $[$a+$b]  #结果30
echo ------------------------------
let a=1+1
echo $a   #结果为2
count=1
let count++  变量count+1
let count--  变量count-1
let count+=10  变量count+=10
let count-=10  变量count-=10
let count*=2   变量count*2
let count/=2   变量count/2
let count%=3   变量count%3
echo  $count
bc
1.1+1   #结果2.2
#退出命令   :quit
#在命令中使用
echo  1.1+1  |  bc
echo  10/3   |  bc

test表达式 [ a == b ] 空格不能少

#方法1
#test 表达式
test  abc == abc
echo $?
test abc == qwe
echo $?
#方法2
#表达式
[ abc == abc ]
echo $?
[ abcd == abc ]
echo $?

echo ----------------------------------------

a=qwe
b=wdd
[ $a == $b ]
echo $?
[ $a != $b ]
echo $?

echo -------------------------------------

#如果少空格
[ a==b ]
echo $?  #结果为0

echo  -------------------------------------------

a=abc
[ $a == $c ]   #执行报错,因为c没有定义
[ "$a" == "$c" ]   #不会报错
echo $?  #结果为非0

echo ---------------------------------------------
# -z判断是否为空 (必须字母在前,变量在后)
[ -z "$c" ]
echo $?  #结果为0
[ ! -z "$c"]
echo $?  #结果为非0
# -n判断是否为非空
[ -n "$c" ]
echo $?  #结果为非0

逻辑组合

&&与 前边语句执行成功,执行后边语句

|| 或 前边语句执行失败,执行后边语句

[ root == $USER ] || exit
read -p -t 10  "请输入用户名:"  u
useradd $u
stty -echo   #输入密码时隐藏
read -p -t 10  "请输入用户密码:"  n
echo $n  |  sudo  passwd  --stdin  tom 
stty echo

echo --------------------------

touch  a  b  c
ls a && ls b && ls c   #结果a,b,c     ls  a 执行成功 执行ls b ,  ls a $$ ls b 执行成功 执行ls c  
ls a || ls b || ls c   #结果a         ls  a 执行成功 不需要执行 ls b  ,   ls a  ||  ls b 执行成功  不需要执行 ls c
ls a || ls b && ls c   #结果a,c       ls  a 执行成功 不需要执行 ls b  ,   ls a  ||  ls b 执行成功  执行 ls c
ls a && ls b || ls c   #结果a,b       ls  a 执行成功 执行ls b ,  ls a &&  ls b 执行成功 不需要执行ls c

echo ---------------------------------------------

[ root != $USER ]  && echo "非管理员用户" &&  exit
read -p -t  10  "请输入用户名:"  n
useradd $n
stty -echo
read -p -t 10 "请输入用户密码:" u
echo $u |  sudo passwd --stdin  tom
stty echo    

数字比较

-lt  小于  -le 小于等于
-gt  大于  -ge 大于等于
-eq  等于  -ne 不等于
每两分钟检查一次服务器用户有没有增加,如果有发送邮件
1.安装 mail  postfil
sudo  apt  install  mailutils postfil
2.mail test(邮件主题)  -s  root(发送用户)
3.检查服务器用户数量  cat  /etc/passwd  |  wc -l  #查看行数
echo -----------------------------
echo "非交互式发送"  |  mail  test  -s  root

vim  /etc/test.sh
#!/bin/bash
a= $(cat /etc/passwd |  wc -l)
[ $a -gt 55] && echo "服务器有人入侵了"  | mail  -s test  root
给脚本赋予执行权限
chmod  +x  test.sh
vim  /etc/cron
*/2 * * * *     /opt/test.sh

文件判断

-e  #判断文件存不存在,不关心文件类型
-f  #判断文件是否存在,只能是普通文件
-d  #判断文件是否存在,必须是目录
-r  #判断当前用户对文件是否有读权限(对root无效) chmod 000  abc.txt  root用户依旧能读和写
-w  #判断当前用户对文件是否有写权限(对root无效)
-x  #判断当前用户对文件是否有执行权限