Shell脚本:
特殊的后缀名的意义:
.sh            shell脚本文件
.py            python脚本文件
.jsp           Java网页文件
.repo   yum仓库配置文件
.php    php语言编写文件
.html   html编写的网页文件
.db     数据库文件
Shell的作用:
1、翻译官,解释用户输入的命令。
2、用户的登录shell程序,默认为/bin/bash
3、shell脚本文件,编写脚本代码必须有执行权限。
Shell脚本的执行方式:
1、脚本的路径:
     绝对路径   root/first.sh
     相对路径   首先切换到脚本文件所在的目录,然后用”./脚本名”去执行。
注:必须脚本文件要有执行权限。
2、sh脚本路径:
方法一:绝对路径     sh  /opt/first.sh
方法二:相对路径     首先切换到脚本文件所在的目录,然后用”sh  脚本名”去执行。
3、source脚本路径:
方法一:绝对路径     source   /opt/first.sh
方法二:相对路径     首先切换到脚本文件所在的目录,然后用”source  脚本名”去执行。
Shell脚本的构成:
1、脚本声明
#!/bin/bash     声明后面的命令可以通过此shell程序去解释并执行。
2、注释信息
摘要、脚本的作用、参数说明、工作效率、创建日期、作者、版本声明、第几次的修改、每次返回的动态值得定义等
3、可执行的命令语句
注:所有特殊符号必须是英文模式输入。
四大剑客:awk,sed,egrep,grep
管道符号的作用:将管道符号左侧的命令执行的结果,作为右侧命令的处理对象。
重定向操作:
类型 操作符 用途
重定向输入 < 从指定的文件读取数据,而不是从键盘输入
重定向输出 > 将输出结果保存到指定的文件(覆盖原有内容)
重定向输出 >> 将输出结果追加到指定的文件(追加内容)
标准错误输出 2> 将错误信息保存到指定的文件(覆盖原有内容)
标准错误输出 2>> 将错误信息追加到指定的文件中(追加内容)
混合输出 &> 将标准输出、标准错误的内容保存到同一个文件
混合输出 &>> 将标准输出、标准错误的内容保存到同一个文件中
自定义变量(小总结):
1、声明变量不需要声明类型
2、可以存储不同类型内容  A=weixin01
3、有时候使用变量时要明确变量类型
4、严格区分大小写
5、等于号两边不允许出现空格
6、首个字符必须是字母(a-z,A-Z或者_)
7、不能使用标点符号作为变量名
8、不能使用bash里面的关键字作为变量名
最基本的赋值方法:
格式:变量名=变量值    等于号两边不允许为空格。
查看变量
格式:echo     $变量名
          echo     ${变量名}
通过echo进行一个输出变量,其中$是引用变量的特殊字符是特殊字符(必须要使用$符号)。
注:echo和调用的变量之间必须要有空格
当需要一起调用多个变量时,以空格隔开
当变量名和后面的字符混淆的时候,因使用{}将变量名括起来
变量赋值的特殊方法:
1、双引号“”
注:echo和调用的变量之间必须要有空格
当需要一起调用多个变量时,以空格隔开
2、单引号‘’  所见即所得
禁止应用变量值,将$符号当作普通字符来使用
3、反撇号  ``
与$()效果一样
作用:命令替换,提取命令执行的结果
ls -l `which useradd`
优先执行反撇号里面的命令,在执行其他
变量赋值的时候,如果要赋值的是某条命令执行的结果,必须使用反撇号
缺点:反撇号不是实现嵌套命令替换操作,这时候使用$()来代替。
rpm  -qc  $(rpm  -qf  $(which  useradd))
A=`rpm  -qc  $(rpm  -qf  $(which  useradd))`
A=$(rpm  -qc  $(rpm  -qf  $(which  useradd)))
4、交互式赋值    read
read命令用于提示用户输入信息,从而实现简单交互过程
(输入命令就是一种交互式的过程)
多个变量名交互式赋值,赋值之间有空格,变量名也有空格。
为了更友好,通常使用-p来设置提示信息
只是在当前shell程序中定义一个变量,但是到其他shell程序中无法引用
设置变量的作用范围:
export  变量名=变量值
设置全值变量,所有子shell程序都可以使用此变量
数值变量的运算:
expr
$(())  加加:++   减减:--   2的n次方:2**n
环境变量:
常见的环境变量:
PWD:显示当前所在的工作目录
USER:用户的名称,可以查看当前登录的用户
HOME:用户的加目录,显示当前用户的家目录
LANG:语言和字符集变量
PATH:命令搜索路径,可以用tab键补全
PS1:提示符变量
位置变量:
方便通过命令行为程序提供操作参数。
当执行命令时,第一个字段表示命令名或者脚本程序名,其余的字符串参数按照从左到右的顺序依次赋值给位置变量
第一个字段位置变量是$0
第二个字段位置变量是$1
第三个字段位置变量是$2
例子:  ls  /opt  /bot  /root
/opt/a.sh   /opt  

vi  weizhi.sh
#!/bin/bash
sum=$(($1+$2))
echo”$1+$2=$sum”
预定义变量脚本:
$#:代表命令行的位置变量的个数
$*:代表每个位置变量的内容
$?:返回上一次执行的结果,0为正确    执行,非0的代表异常(报错)
$0:代表当前执行的命令或者程序名
条件测试:
test 条件表达式   /  条件表达式
常用的测试操作符:
-d 测试是否为目录
-e 测试目录或文件
-f 测试是否为文件
-r 测试当前用户是否有权限读取read
-w 测试当前用户是否有权写入write
逻辑测试:
&&:逻辑与(可改为"-a")
||:逻辑或(可改为"-o")
!:逻辑否
整数值比较:
-eq  A=B
-ne  A≠B
-gt  A>B
-lt  A=B
字符串比较:
格式1  [ 字符串1 = 字符串2 ]
          [ 字符串1 != 字符串2 ]
格式二   [ -z 字符串 ]
=:第一个字符串与第二个字符串相同
!=:第一个字符串与第二个字符串不相同,其中”!”符号表示取反
-z:检查字符串是否为空,对于未定义或赋予空值得变量将视为空串
循环语句:
for循环语句:
需要指定一个变量以及可以取值的取值列表,针对每一个不同的取值相同的命令序列,直到变量值用尽,退出循环
取值列表:for语句的执行条件,其中包括多个属性相同的对象,需要预先指定。
格式:
for  变量名  in 取值列表
do
命令序列
done
注:
for语句的操作对象为用户指定名称的变量
通过in关键字为改变量预先设置一个取值列表
多个取值之间以空格作为分隔
do~done之间是一个循环体
应用领域:
1、字符串取值列表:
#!/bin/bash
#字符串取值列表
for HOME in 北京   上海  广州  安徽  南京
do
echo  "$HOME欢迎你"
done

2、文件取值列表:
#!/bin/bash
#文件取值列表(命令执行取值列表)
i=1
for  USER  in  $(cat  /opt/a)
do
echo  ”$i号用户:$USER”
let  i++ //循环加一
done
3、扫描ip地址:
#!/bin/bash
#扫描ip地址
for  IP  in  192.168.108.{1..254}   //1到254
do
ping  -c  3  -i  0.2  -W  1  $IP  &>  /dev/null
if  [ $? -eq 0 ];then
echo  “$IP  is  up!!!”
else
echo  “$IP  is  down!!!”
fi
done

要求:down的主机ip地址统计有多少个,up的有多少个??
#!/bin/bash
#扫描ip地址
up=0
down=0
for IP in 192.168.108.{1..254}
do
        ping -c 3 -i 0.2 -W 1 $IP &> /dev/null

        if [ $? -eq 0 ];then
                        echo "$IP is up!!!"
                 let  up++    
            else
                        echo "$IP is down!!!"
              let down++        
fi
done
       echo "up地址有=$up,down地址有=$down"
4、批量添加用户:
方法一:同一个姓
#!/bin/bash
#批量添加用户
for  A  in  teacher{1..5}
do
useradd  $A
echo  123  |  passwd  --stdin  $A  $>  /dev/null
done

方法二:不同姓名
vi  b.txt
lisi
zhangsan
wangwu
jack
#!/bin/bash
#批量添加用户
for  A  in  $(cat  /opt/b)
do
useradd  $A
echo  123  |  passwd  --stdin  $A  $>  /dev/null
done
while循环语句:
while和for的区别
for语句非常适合用于列表对象无规律,且列表来源是固定的场合
while对于要求控制循环次数、操作对象按数字顺序编号,按特定条件执行重复操作。
重复测试某个条件时,只要条件成立就会反复执行(无限),除非强制终止,或者exit语句退出脚本
格式:
while  条件测试操作(判断语句)
do
命令序列
done
应用领域
1、批量添加用户
#!/bin/bash
U=”student”
i=1
while  [ $i  -le  10 ]
do
useradd  $U$i
echo  123  |  passwd  --stdin  $U$i  $>  /dev/null
let i++
done
2、交互式批量创建
#!/bin/bash
read  -p  “请输入要创建用户的前缀:”  X
read  -p  “请输入要创建用户的个数:”  M
read  -p  “请输入用户的初始密码:”  N
i=1
while  [ $i  -le  $10 ]
do
useradd  $X$i
echo  “$N”  |  passwd  --stdin  $X$i  $>  /dev/null
chage  -d  0  $X$i
let i++
done
3、猜价格游戏
#!/bin/bash
P=$(($PANDOM%1000))
T=0
echo  “商品实际价格范围0~999,请猜一猜看是多少?”
while  true
do
read  -p  “请输入猜测的价格数目:”INT
let  T++
if  [ $INT  -eq  $P ];then
echo  “恭喜答对了,实际价格是$P”
echo  ”你总共猜测了$T次”
exit  0   //正常退出脚本
elif  [ $INT  -gt  $P ];then
echo  “太高了”
else
echo  “太低了”
fi
done
作业:99乘法表
#!/bin/bash
#for loop
for (( i=1;i<=9;i++ ))
do
    for (( j=1;j<=i;j++  ))
    do
       let "temp=i*j"
       echo -n "$i*$j=$temp "
    done
    echo ""
done
shell函数
格式:
[ function ] 函数名(){
命令序列
[return  x]
}
注:
[ function ]是可写可不写,表示该函数的功能,可省略
()里面是没有内容的,固定格式
执行的命令序列放在{}里面
[return  x]的作用是当命令序列执行完后返回给系统一个值相当于echo  $?
例子:
两个求和
#!/bin/bash
sum(){
        echo "你需要计算的两个整数分别是:$1和$2"
        SUM=$(($1+$2))
        echo "$1 + $2 = $SUM"
}
sum $1 $2
单分支:
if  条件测试操作
then
命令序列
fi
双分支:
if  条件测试操作
then
命令序列1
else
命令序列2
fi
多分支:
if  条件测试操作
then
命令序列1
elif  条件测试操作2
then
命令序列2
else
命令序列3
fi