Shell核心

一. Shell传参方式
第一种传参方式:
直接传参: $1 脚本的第一个参数 $2 脚本的第二个参数
    [root@shell day2]# cat env.sh 
    #!/bin/sh
    echo $1 $2
    [root@shell day2]# sh env.sh oldboy 18
    oldboy 18

    [root@shell day2]# cat env.sh
    #!/bin/sh
    echo name: $1 
    echo age: $2
    [root@shell day2]# sh env.sh oldboy 123
    name: oldboy
    age: 123
    [root@shell day2]# cat env.sh
    #!/bin/sh
    echo name=$1 
    echo age=$2
    [root@shell day2]# sh env.sh oldboy 123
    name=oldboy
    age=123

第二种传参方式: 赋值传参

    [root@shell day2]# cat env.sh
    #!/bin/sh
    name=$1
    age=$2
    echo name=$name
    echo age=$age
    [root@shell day2]# sh env.sh oldboy 123
    name=oldboy
    age=123


案例:
    [root@shell day2]# cat env.sh 
    #!/bin/sh
    touc /tmp/test.txt
    result=$?
    name=$1
    age=$2
    echo name=$name
    echo age=$age
    [ $result -eq 0 ] && echo ok || echo error
    [root@shell day2]# sh env.sh oldboy 123
    env.sh: line 2: touc: command not found
    name=oldboy
    age=123
    error
    
第三种传参方式: read读入
    [root@shell day2]# cat> env.sh <<EOF
    #!/bin/sh
    read -p "Please Input two env: " name age
    echo $name $age
    EOF
    [root@shell day2]# sh env.sh
    Please Input two env: oldboy 123
    oldboy 123

    [root@shell day2]# cat env.sh
    #!/bin/sh
    read -p "Please Input name env: " name
    read -p "Please Input age env: " age
    echo name: $name 
    echo age: $age
    [root@shell day2]# 
    [root@shell day2]# sh env.sh
    Please Input name env: oldboy
    Please Input age env: 123
    name: oldboy
    age: 123


案例: 使用三种传参方式来修改IP地址和主机名称
1)修改IP地址
2)修改主机名称

    [root@test day2]# cat name.sh 
    #!/bin/sh
    #修改主机名称
    name=$1
    hostnamectl set-hostname $name
    #修改IP地址
    ip_dir=/etc/sysconfig/network-scripts/ifcfg-eth0
    #1.获取当前的IP地址
    ipadd=`grep ^IP $ip_dir|awk -F. '{print $NF}'`
    #2.将获取的当前的IP地址替换成新的IP
    read -p "请输入新的ip的最后一位: " ip 
    sed -i "s#$ipadd#$ip#g" $ip_dir
    grep 'IPADDR' $ip_dir

小结: 脚本传参方式三种
直接传参
赋值传参
read传参


二. 数值运算
加减乘除幂取余
1. expr 不支持小数运算
    [root@test day2]# expr 1+1
    1+1
    [root@test day2]# expr oldboy
    oldboy
    [root@test day2]# expr 1 + 1
    2
    [root@test day2]# expr 10 - 1
    9
    [root@test day2]# expr 10 * 1
    expr: syntax error
    [root@test day2]# expr 10 \* 1
    10

案例: 通过expr判断用户输入的是否为整数
    [root@test day2]# expr 1 + 1 &>/dev/null
    [root@test day2]# echo $?
    0
    [root@test day2]# expr 1 + 1.5 &>/dev/null
    [root@test day2]# echo $?
    2
案例: oldboy 不能过99
    [root@test day2]# cat env.sh 
    #!/bin/sh
    read -p "Please Input name env: " name
    read -p "Please Input age env: " age
    expr 1 + $age &>/dev/null
    [ $? -ne 0 ] && echo 请输入正确的年龄 && exit

    [ ${#age} -gt 2 ] && echo 请输入小于100的年龄 && exit
    [ `echo $age|wc -L` -gt 2 ] && echo 请输入小于100的年龄 && exit
    [ $age -gt 99 ] && echo 请输入小于100的年龄 && exit


    echo name: $name 
    echo age: $age

    ---------------------执行结果
    [root@test day2]# sh env.sh
    Please Input name env: oldboy
    Please Input age env: 1
    name: oldboy
    age: 1
    [root@test day2]# sh env.sh
    Please Input name env: oldboy
    Please Input age env: 99
    name: oldboy
    age: 99
    ----------------------


2. $[] 不支持小数运算 
    [root@test day2]# echo $[1+1]
    2
    [root@test day2]# echo $[1*1]
    1
    [root@test day2]# echo $[1*10]
    10
    [root@test day2]# echo $[1-10]
    -9
    [root@test day2]# echo $[10-10]
    0
    [root@test day2]# echo $[10**10]
    10000000000
    [root@test day2]# echo $[10%10]
    0

3. $(()) 不支持小数 运算效率最高
    [root@test day2]# echo $((10*10))
    100
    [root@test day2]# echo $((10**10))
    10000000000
    [root@test day2]# echo $((10/10))
    1
    [root@test day2]# echo $((10/10*10))
    10
    [root@test day2]# echo $((10/10*10-2))
    8
    [root@test day2]# echo $((10/10*10-2**4))
    -6
    [root@test day2]# echo $((10/10*(10-2)**4))
    4096

4. let运算 不支持小数
以变量的方式做运算
    [root@test day2]# let 1+1
    [root@test day2]# let 1 + 1
    -bash: let: +: syntax error: operand expected (error token is "+")
    [root@test day2]# let a=10+10
    [root@test day2]# echo $a
    20
    [root@test day2]# let a=10*10
    [root@test day2]# echo $a
    100
    [root@test day2]# let a=10/10
    [root@test day2]# echo $a
    1

    [root@test day2]# let i++
    [root@test day2]# echo $i
    1
    [root@test day2]# #i++ ======== i=i+1
    [root@test day2]# let i++
    [root@test day2]# let i++
    [root@test day2]# let i++
    [root@test day2]# echo $i
    4


    [root@test day2]# unset i        # 取消变量
    [root@test day2]# let ++i
    [root@test day2]# let ++i
    [root@test day2]# let ++i
    [root@test day2]# echo $i
    3

i++和++i的区别
   直接做运算结果相同
   有变量赋值情况下结果不同
   i++ 先赋值在运算
   ++i 先运算在赋值
   
    [root@test ~]# a=1
    [root@test ~]# b=1
    [root@test ~]# let c=a++
    [root@test ~]# let d=++b
    [root@test ~]# #let c=a++  c=a+1
    [root@test ~]# #let d=++b  d=1+b
    [root@test ~]# echo $c
    1
    [root@test ~]# echo $d
    2


5. bc 支持小数和整数运算
    [root@test ~]# yum -y install bc
    [root@test ~]# echo 1+1|bc
    2
    [root@test ~]# echo 10+1.5|bc
    11.5
    [root@test ~]# echo 10*1.5|bc
    15.0

    [root@test ~]# echo 10/3|bc
    3

6. awk python
    [root@test ~]# awk 'BEGIN{print 10/3}'
    3.33333
    [root@test ~]# awk 'BEGIN{print 10**3}'
    1000
    [root@test ~]# awk 'BEGIN{print 10**3.2}'
    1584.89
    [root@test ~]# awk 'BEGIN{print 10-3.2}'
    6.8
    [root@test ~]# awk 'BEGIN{print 10-3.2*100/3}'
    -96.6667

    [root@test ~]# echo 100 200|awk '{print $1*$2}'
    20000
    [root@test ~]# echo 100 200|awk '{print $1/$2}'
    0.5
    [root@test ~]# echo 100 200|awk '{print $1**$2}'
    inf
    [root@test ~]# echo 100 2|awk '{print $1**$2}'
    10000

案例: 写一个脚本传参的方式做一个计算器 加减乘除
要求输出结果:
sh count.sh
输入两个数字: 100 20
判断两个数字是否为整数
100+20=
100-20=
100/20=
100*20=

三. 比较表达式:整数比较
语法结构:
        判断比较两个数字大小
        test  20  比较符 10
        [ 整数1 比较符 整数2 ]
        [ `命令` 比较符 整数 ]
        
        
比较符:
=    -eq
>    -gt
>=   -ge
<    -lt
<=   -le
!=   -ne


比较判断: 使用test 了解
    [root@test ~]# test 20 -gt 10
    [root@test ~]# echo $?
    0
    [root@test ~]# test 20 -gt 100
    [root@test ~]# echo $?
    1


    [root@test ~]# test 20 -gt 10 && echo 成立 || echo 不成立
    成立
    [root@test ~]# test 10 -gt 10 && echo 成立 || echo 不成立
    不成立
    [root@test ~]# test 10 -eq 10 && echo 成立 || echo 不成立
    成立
比较判断: 使用[] 掌握重点 整数两端必须有空格
    [root@test ~]# [ 100 -gt 20 ]
    [root@test ~]# [ 100 -gt 20]
    -bash: [: missing `]'
    [root@test ~]# [100 -gt 20 ]
    -bash: [100: command not found
    [root@test ~]# [ 100 -gt 20 ] && echo 成立 || echo 不成立
    成立
    [root@test ~]# [ 100 -gt 100 ] && echo 成立 || echo 不成立
    不成立
    [root@test ~]# [ 100 -ge 100 ] && echo 成立 || echo 不成立
    成立
    [root@test ~]# [ 1000 -ge 100 ] && echo 成立 || echo 不成立
    成立
    [root@test ~]# [ 1000 -ne 100 ] && echo 成立 || echo 不成立
    成立
    [root@test ~]# [ 1000 -le 100 ] && echo 成立 || echo 不成立
    不成立

判断支持命令
    [root@test ~]# grep bash /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    [root@test ~]# grep bash /etc/passwd|wc -l
    1
    [root@test ~]# [ `grep bash /etc/passwd|wc -l` -eq 1  ] && echo 成立 || echo 不成立
    成立
    [root@test ~]# [ `grep bash /etc/passwd|wc -l` -ne 0  ] && echo 成立 || echo 不成立
    成立
    [root@test ~]# [ `grep bash /etc/passwd|wc -l` -gt 0  ] && echo 成立 || echo 不成立
    成立
    [root@test ~]# [ `grep bash /etc/passwd|wc -l` -gt 1  ] && echo 成立 || echo 不成立
    不成立

案例: 使用read传参 输入两个整数 是否为整数做判断 然后比对两个数字的大小(禁止使用if)

案例: 取字母排行统计 取单词排行统计
    [root@test ~]# grep '[a-Z]' /etc/passwd -o|sort |uniq -c|sort -rn|head
     83 n
     73 o
     63 s
     58 i
     39 b
     36 t
     35 l
     35 a
     34 e
     29 r
    [root@test ~]# sed 's#[-:x/0-9 ]########g' /etc/passwd|grep '[a-Z]' -o
    [root@test ~]# sed 's#[-:/0-9]# #g' /etc/passwd|xargs -n1|sort |uniq -c|sort -rn|head
     23 sbin
     21 x
     17 nologin
      7 var
      5 bin
      4 root
      3 sync
      3 spool
      3 shutdown
      3 mail

多整数比较
并且: -a   and
或者: -o   or
语法结构:
        [ 整数1 比较符 整数2 并且  整数3 比较符 整数4 ]
        [ 整数1 比较符 整数2 或者  整数3 比较符 整数4 ]
        
案例:
    [root@test ~]# [ 100 -gt 20 -a 20 -eq 30 ] && echo 成立 || echo 不成立
    不成立
    [root@test ~]# [ 100 -gt 20 -a 20 -le 30 ] && echo 成立 || echo 不成立
    成立
    [root@test ~]# [ 100 -gt 20 -o 20 -eq 30 ] && echo 成立 || echo 不成立
    成立
    [root@test ~]# [ 100 -lt 20 -o 20 -eq 30 ] && echo 成立 || echo 不成立
    不成立

    [root@test day2]# cat env.sh 
    #!/bin/sh
    read -p "Please Input name env: " name
    read -p "Please Input age env: " age
    expr 1 + $age &>/dev/null
    [ $? -ne 0 ] && echo 请输入正确的年龄 && exit

    if [ $age -gt 0 -a $age -lt 100 ];then
       echo name: $name 
       echo age: $age
    else
       echo "不成立"
       exit
    fi


四.条件表达式: 文件判断
语法格式:
        test  -f  /etc/hosts
        [ 判断符 文件/目录/路径 ]
        [ -f /etc/hosts ]
判断符号:
-f  文件存在则为真(文件为常规普通文件)
-d  目录存在则为真
-e  任意文件存在则为真
-r  文件可读为真
-w  文件可写为真
-x  文件可执行为真
! -f 取反


    [root@test day2]# [ -f /etc/hosts ] && echo 文件存在 || echo 文件不存在
    文件存在
    [root@test day2]# [ -e /etc/hosts ] && echo 文件存在 || echo 文件不存在
    文件存在
    [root@test day2]# [ -f /etc/ ] && echo 文件存在 || echo 文件不存在
    文件不存在
    [root@test day2]# [ -d /etc/ ] && echo 文件存在 || echo 文件不存在
    文件存在
    [root@test day2]# [ -e /etc/ ] && echo 文件存在 || echo 文件不存在
    文件存在
    [root@test day2]# [ -r /etc/ ] && echo 文件存在 || echo 文件不存在
    文件存在
    [root@test day2]# [ -r /etc/hosts ] && echo 文件存在 || echo 文件不存在
    文件存在
    [root@test day2]# [ -x /etc/hosts ] && echo 文件存在 || echo 文件不存在
    文件不存在
    
    [root@test day2]# [ -f /etc/hosts -a -d /etc ] && echo ok || echo error
    ok
    [root@test day2]# [ -d /etc/hosts -a -d /etc ] && echo ok || echo error
    error
    [root@test day2]# [ -d /etc/hosts -o -d /etc ] && echo ok || echo error
    ok

案例: 判断文件存在则执行
    判断bashrc存在则执行
    if [ -f /etc/bashrc ]; then
    . /etc/bashrc
    fi

    调用函数库
    [root@test ~]# cat test.sh
    hehe(){
          echo test
    }
    hehe
    [root@test ~]# sh test.sh
    test
    [root@test ~]# hehe
    -bash: hehe: command not found
    [root@test ~]# hehe
    -bash: hehe: command not found
    [root@test ~]# source test.sh 
    test
    [root@test ~]# hehe
    test

    
    [root@test day2]# cat test.sh
    #!/bin/bash
    [ -f /etc/init.d/functions ] && . /etc/init.d/functions
    if [ -f $1 ];then
      action "$1" /bin/true
    else
      action "$1" /bin/false
    fi
    [root@test day2]# sh test.sh /etc/hosts
    /etc/hosts                                                 [  OK  ]
    [root@test day2]# sh test.sh /etc/hostssssss
    /etc/hostssssss                                            [FAILED]
    [root@test day2]# sh test.sh /etc/
    /etc/                                                      [FAILED]
    [root@test day2]# sh test.sh /etc/passwd
    /etc/passwd                                                [  OK  ]

   案例2: 判断目录是否存在 如果不存在则创建
   [root@test day2]# [ -d oldboy ] || mkdir oldboy
    [root@test day2]# ll
    drwxr-xr-x 2 root root   6 Aug  2 11:20 oldboy

   
五.条件表达式:字符串比对
语法格式:
        [ 字符串1  = 字符串2 ]
        [ 字符串1 != 字符串2 ]
        
-n  字符串不为0则为真
-z  字符串为0则为真
    [root@test day2]# test=aaa
    [root@test day2]# echo $test
    aaa
    [root@test day2]# [ -n $test ] && echo 成立
    成立
    [root@test day2]# test=""
    [root@test day2]# [ -z $test ] && echo 成立
    成立
案例: 用户输入的字符串为0则退出
    [root@test day2]# cat env.sh 
    #!/bin/sh
    read -p "Please Input name env: " name
    [ -z $name ] && echo "必须输入名称" && exit

    [root@test day2]# [ root = root ] && echo 成立|| echo 不成立
    成立
    [root@test day2]# [ root = roo ] && echo 成立|| echo 不成立
    不成立
    [root@test day2]# [ root != roo ] && echo 成立|| echo 不成立
    成立
    [root@test day2]# [ $name != roo ] && echo 成立|| echo 不成立
    成立
    [root@test day2]# [ $name = roo ] && echo 成立|| echo 不成立
    不成立
    [root@test day2]# echo $name
    hehe
    [root@test day2]# [ $name = hehe ] && echo 成立|| echo 不成立
    成立

    [root@test day2]# [ $name = roo -o $name = hehe ] && echo 成立|| echo 不成立
    成立
    
正则匹配:
    [root@test day2]# [[ root =~ ^ro ]] && echo 成立|| echo 不成立
    成立
    [root@test day2]# 
    [root@test day2]# [[ root =~ t$ ]] && echo 成立|| echo 不成立
    成立
    [root@test day2]# [[ root =~ [a-z]$ ]] && echo 成立|| echo 不成立
    成立
    [root@test day2]# [[ root =~ [0-9]$ ]] && echo 成立|| echo 不成立
    不成立
    [root@test day2]# [[ root1 =~ [0-9]$ ]] && echo 成立|| echo 不成立
    成立

案例: 要求传参的名称必须为字母 不允许有数字
    #!/bin/sh
    read -p "Please Input name env: " name
    [ -z $name ] && echo "必须输入名称" && exit
    if [[ ! $name =~ [0-9] ]];then
       echo $name
    else
       echo "必须为字母"
       exit
    fi


    [root@test day2]# cat env.sh 
    #!/bin/sh
    read -p "Please Input name env: " name
    [ -z $name ] && echo "必须输入名称" && exit
    if [[  $name =~ ^[a-Z]+$ ]];then
       echo $name
    else
       echo "必须为字母"
       exit
    fi

    [root@test day2]# cat env.sh 
    #!/bin/sh
    read -p "Please Input name env: " name
    [ -z $name ] && echo "必须输入名称" && exit
    if [[  $name =~ ^[a-Z]+$ ]];then
       echo $name
    else
       echo "必须为字母"
       exit
    fi


    read -p "Please Input age env: " age
    if [[ $age =~ ^[0-9]{2}$ ]];then
      echo $age
    else
       echo "必须输入0-100之间的数字"
       exit
    fi


    [root@test day2]# [[ old100 =~ [a-z] ]] && echo 成立 || echo 不成立
    成立
    [root@test day2]# [[ old100 =~ [a-z]$ ]] && echo 成立 || echo 不成立
    不成立
    [root@test day2]# [[ old100 =~ ^[a-z]$ ]] && echo 成立 || echo 不成立
    不成立
    [root@test day2]# [[ oldboy =~ ^[a-z]$ ]] && echo 成立 || echo 不成立
    不成立
    [root@test day2]# [[ o =~ ^[a-z]$ ]] && echo 成立 || echo 不成立
    成立
    [root@test day2]# [[ a =~ ^[a-z]$ ]] && echo 成立 || echo 不成立
    成立
    [root@test day2]# [[ oldboy =~ ^[a-z]+$ ]] && echo 成立 || echo 不成立
    成立
    [root@test day2]# [[ ol45dboy =~ ^[a-z]+$ ]] && echo 成立 || echo 不成立
    不成立
    


案例: 
1. 获取磁盘使用率
2. 获取到的值如果大于80则发送邮件告警 小于80则提示磁盘使用率正常 并输出当前的值

1. 获取内存使用率
2. 如果内存值大于80则提示内存使用异常输出当前值 小于80则提示内存使用正常 输出当前值

1. 获取Linux操作系统的以下信息 输出到屏幕:
  ETH0ip地址
  公网IP地址
  系统版本
  虚拟平台Virtualization
  内核版本
  主机名称
  磁盘使用率
  内存使用率
  负载
  网络是否正常
  
要求执行结果:
先定义变量
调用变量
sh os.sh
操作系统: eth0IP=10.0.0.7
公网IP地址: 221.218.210.53
系统版本: centos7
主机名称: shell
磁盘使用率: 11%
...
网络: 正常


小结: 
1.脚本传参方式
    直接传参 $1 $2
    赋值传参 name=$1
    read传参 read -p "提示" name

2.数值运算:
整数: expr $[] $(()) let  bc
都支持: awk python

3.数值比较
test 了解
[ 整数1 比较符 整数2 ]
-eq
-ne
-lt
-le
-gt
-ge

多整数比较 -a -o

4.文件判断
[ 判断符 文件/目录 ]
-f
-d
-e 
-r 
-w 
-x
案例 文件存在则执行
/etc/init.d/functions

5.字符串比对
-n 值不为0为真
-z 值为0则为真

[  root = root ]
[ root != root ]

6.正则匹配

[[ root =~ ^r ]]
[[ root =~ ^[0-9] ]]
[[ $name =~ ^[a-Z0-9]+$ ]]


判断是否为整数
判断传参的个数
判断传参参数的长度
expr
[[ $age = ^[0-9]+$ ]]
判断是否为空
[ -z $name ]


    
    


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值