zoukankan      html  css  js  c++  java
  • shell2

    对于简单的需求,shell比python好,语法简单

    一 什么是shell script
    将OS命令堆积到可执行的文件里,由上至下的顺序执行文本里的OS命令 就是脚本了.
      再加上些智能(条件/流控)控制,就变成了智能化脚本了.

    系统变量
    set和env的区别
    set:显示所有变量
    env:环境变量
    [root@www ~]# xxxxxx=1
    [root@www ~]# set |grep xxxx
    xxxxxx=1
    [root@www ~]#

    要取消abd的赋值,就用unset,因为set保存了。

    [root@www ~]# abd=value

    [root@www ~]# echo $abd

    value

    [root@www ~]# unset abd

    [root@www ~]# echo $abd

    [root@www ~]#

    常用系统变量
    PATH
    PWD
    LANG
    HOME
    HISTSIZE
    PS1
    IFS
    域分隔符 是空格,换行,TAB键的合集
    part6 全局变量与局部变量
    [root@www ~]# HISTSIZE=2
    [root@www ~]# history
    172 HISTSIZE=2
    173 history
    [root@www ~]#

    Profile上面就有HISTSIZE=1000
    [root@www ~]# vim /etc/profile
    HISTSIZE=1000

    u是用户名,h是hostname, W是所在目录

    [root@www ~]# echo $PS1

    [u@h W]$

    [root@www ~]#

    母函数和子函数,母函数能用到子函数上,但是子函数(局部变量)不会用到母函数上

    [root@www ~]# export money=10000

    [root@www ~]# echo $money

    10000

    [root@www ~]# bash

    [root@www ~]# echo $money

    10000

    [root@www ~]# export mon=200

    [root@www ~]# exit

    exit

    [root@www ~]# echo $mon

    [root@www ~]#

    取第3行第2个

    [root@www ~]# free

                  total        used        free      shared  buff/cache   available

    Mem:         999696      261084      387380        7400      351232      555268

    Swap:       2097148           0     2097148

    [root@www ~]# free |awk 'NR==3{print $2}'

    2097148

    [root@www ~]#

    运算符号:

    [root@u ~]# ((2<10))

    [root@u ~]# echo $?

    0

    [root@u ~]#

    如果想用[],要查man test 

           STRING1 != STRING2

                  the strings are not equal

           INTEGER1 -eq INTEGER2

                  INTEGER1 is equal to INTEGER2

    -eq表示==

    -lt表示小于

    -gt 表示大于

    -a表示&&

    -o表示||

    -ge表示大于等于

    -le表示小于等于

    -ne表示不等于

     

    例子:

    [root@u ~]# [ 2 -eq 10 ]

    [root@u ~]# echo $?

    1

    [root@u ~]# [ 2 -eq 2 ]

    [root@u ~]# echo $?

    0

    [root@u ~]#

    2小于等于10

    [root@u ~]# [ 2 -le 10 ]

    [root@u ~]# echo $?

    0

    [root@u ~]#

    赋值:

    [root@u ~]# x=7

    [root@u ~]# y=$x

    [root@u ~]# echo $x

    7

    [root@u ~]# echo $y

    7

    [root@u ~]#

    数学运算要在[]内

    [root@u ~]# x=2

    [root@u ~]# x=$[$x+1]

    [root@u ~]# echo $x

    3

    [root@u ~]#

    最好用下面的方法:直观

    [root@u ~]# echo $x

    4

    [root@u ~]# ((x=x+1))

    [root@u ~]# echo $x

    5

    [root@u ~]#

    这样也行:

    [root@u ~]# x=1

    [root@u ~]# ((x+=1))

    [root@u ~]# echo $x

    2

    [root@u ~]#

    如果自增1的话,可以用++

    [root@u ~]# i=0

    [root@u ~]# ((i++))

    [root@u ~]# echo $i

    1

    [root@u ~]#

    自减1,--

    [root@u ~]# x=1

    [root@u ~]# echo $((x+=1))

    2

    [root@u ~]#

    Shell的所有计算器

    $[]

    (())

    expr

    [root@u ~]# expr 1 + 2

    3

    [root@u ~]#

    [root@u ~]# x=1

    [root@u ~]# y=2

    [root@u ~]# expr $x + $y

    3

    [root@u ~]#

    [root@u ~]# a=`expr $x + $y`

    [root@u ~]# echo $a

    3

    [root@u ~]#

    上面都只取整数

    [root@u ~]# expr 99 / 134

    0

    [root@u ~]#

    要是除数结果有小数点,就要安装BC软件包

    [root@u ~]# yum install bc -y

    保留两位小数

    [root@u ~]# echo 'scale=2;30/1000'|bc -l

    .03

    [root@u ~]#

    找使用率

    [root@u ~]# free

                  total        used        free      shared  buff/cache   available

    Mem:         999696      306920      214848        7384      477928      487236

    Swap:       2097148           0     2097148

    计算小数要用双引号

    [root@u ~]# total=`free | awk 'NR==2{print $2}'`

    [root@u ~]# echo $total

    999696

    [root@u ~]# use=`free | awk 'NR==2{print $3}'`

    [root@u ~]# echo $use

    307648

    [root@u ~]# echo "scale=2;$use/$total"|bc -l

    .30

    [root@u ~]#

     

    如果要输出百分比,就要取以.做分割cut -d.,取第2个,再加%

    [root@u ~]# echo "scale=2;$use/$total"|bc -l|cut -d. -f2

    30

    [root@u ~]# b=`echo "scale=2;$use/$total"|bc -l|cut -d. -f2`

    [root@u ~]# echo $b%

    30%

    [root@u ~]# echo ${b}%

    30%

    [root@u ~]#

    part5-1、测试文件状态
    -d 测试目录是否存在
    [root@u ~]# test -d /etc
    [root@u ~]# echo $?
    0
    [root@u ~]# [ -d /etc ]
    [root@u ~]# echo $?
    0
    [root@u ~]#

    -e文件
    [root@u ~]# [ -e /root/a.txt ]
    [root@u ~]# echo $?
    0
    [root@u ~]#

    -s 文件长度 > 0、非空(文件存在且非空)
    [root@u ~]# [ -s /etc/passwd ]
    [root@u ~]# echo $?
    0

    -f 正规文件(普通文件)
    -w 可写
    -r 可读
    -x 可执行
    [root@u ~]# [ -w /etc/passwd ]
    [root@u ~]# echo $?
    0
    [root@u ~]# [ -r /etc/passwd ]
    [root@u ~]# echo $?
    0
    [root@u ~]# [ -x /etc/passwd ]
    [root@u ~]# echo $?
    1
    [root@u ~]# ll -d /etc/passwd
    -rw-r--r--. 1 root root 2225 11月 16 23:22 /etc/passwd
    当前用户是否具有可读可写可执行权限
    [root@u ~]#

    -L 符号连接
    -u 文件有 suid 位设置

    -h连接文件
    [root@u ~]# ln -s /root/abg.txt /tmp/
    [root@u ~]# ll /tmp/abg.txt
    lrwxrwxrwx 1 root root 13 12月 9 22:53 /tmp/abg.txt -> /root/abg.txt
    [root@u ~]# [ -h /tmp/abg.txt ]
    [root@u ~]# echo $?
    0
    [root@u ~]#

    part5-2、字符串测试
    = 两个字符串相等
    != 两个字符串不相等
    -z 空串
    -n 非空串

     

    [root@u ~]# x='hello'

    [root@u ~]# y='hello'

    [root@u ~]# [ -z $x ]

    [root@u ~]# echo $?

    1

    [root@u ~]# [ -n $x ]

    [root@u ~]# echo $?

    0

    [root@u ~]# [ $x = $y ]

    [root@u ~]# echo $?

    0

    [root@u ~]# [ $x != $y ]

    [root@u ~]# echo $?

    1

    [root@u ~]#

     

    [root@MiWiFi-R3-srv ~]# var1='abc'
    [root@MiWiFi-R3-srv ~]# var2='123'
    [root@MiWiFi-R3-srv ~]# [ $var1 == $var2 ]
    [root@MiWiFi-R3-srv ~]# echo $?
    1

    part5-3、测试数值
    -eq 等于
    -ne 不等于
    -gt 大于
    -lt 小于
    -ge 大于等于
    -le 小于等于

    建一个脚本:写脚本判断文件是什么文件

    [root@u ~]# mkdir /test

    mkdir: 无法创建目录"/test": 文件已存在

    [root@u ~]# cd /test

    [root@u test]# ls

    a.txt  b.txt  c.txt  d.txt  gaizhujiming.sh  root.txt  son

    [root@u test]#

    [root@u test]# vim 1.sh

    [root@u test]# cat 1.sh

    # !/bin/bash

    var='/etc/passwd'

    if [ -f $var  ]

        then

            echo "$var is regular file"

    elif [ -b $var  ]

        then

            echo "$var is block"

    elif [ -d $var  ]

        then

            echo "$var is direcotry"

    elif [ -h $var  ]

        then

            echo "$var is symlink"

    else

        echo "$var is unkown"

    fi

    [root@u test]#

    [root@u test]# chmod +x 1.sh

    [root@u test]# ./1.sh

    /etc/passwd is regular file

    [root@u test]#

    修改var的赋值,得到:

    [root@u test]# cat 1.sh

    # !/bin/bash

    var='/etc/passwd'

    var='/dev/sda'

    var='/etc'

    var='sdf'

    if [ -f $var  ]

        then

            echo "$var is regular file"

    elif [ -b $var  ]

        then

            echo "$var is block"

    elif [ -d $var  ]

        then

            echo "$var is direcotry"

    elif [ -h $var  ]

        then

            echo "$var is symlink"

    else

        echo "$var is unkown"

    fi

    [root@u test]#

    [root@u test]# vim 1.sh

    [root@u test]# ./1.sh

    /dev/sda is block

    [root@u test]# vim 1.sh

    [root@u test]# ./1.sh

    /etc is direcotry

    [root@u test]# ./1.sh

    sdf is unkown

    [root@u test]#

    把1.sh是全部信息和权限都复制到2.sh

    [root@u test]# cp -a 1.sh 2.sh

    [root@u test]#

    如果想不打开文件,直接修改脚本就要:

    [root@u test]# vim 1.sh

    [root@u test]# cat 1.sh

    # !/bin/bash

    read -p 'please input your file paht:' var

    if [ -f $var  ]

        then

            echo "$var is regular file"

    elif [ -b $var  ]

        then

            echo "$var is block"

    elif [ -d $var  ]

        then

            echo "$var is direcotry"

    elif [ -h $var  ]

        then

            echo "$var is symlink"

    else

        echo "$var is unkown"

    fi

    [root@u test]#

    输入,就可以自动得到结果:

    [root@u test]# ./1.sh

    please input your file paht:/etc

    /etc is direcotry

    [root@u test]#

    [root@u test]# ./1.sh

    please input your file paht:/etc/passwd

    /etc/passwd is regular file

    [root@u test]#

    如果不要./的话,就用整个目录,如:

    [root@u test]# /test/1.sh

    please input your file paht:/root

    /root is direcotry

    [root@u test]#

    [root@u test]# vim 4.sh

    脚本意思是取第1、2、3、4、5、10个数

    [root@u test]# cat 4.sh

    #!/bin/bash

    echo $1

    echo $2

    echo $3

    echo $4

    echo $5

    echo ${10}

    [root@u test]#

    [root@u test]# ./4.sh

    -bash: ./4.sh: 权限不够

    [root@u test]# chmod +x 4.sh

    先执行看看:

    [root@u test]# ./4.sh

    [root@u test]#

    [root@u test]# ./4.sh a b c e u y zz 1 2 3 4 5

    a

    b

    c

    e

    u

    3

    [root@u test]#

    如果想直接在./2.sh后面直接写var要输入的值,可以这样写:

    [root@u test]# cat 2.sh

    # !/bin/bash

    echo $1

    if [ -f $var  ]

        then

            echo "$var is regular file"

    elif [ -b $var  ]

        then

            echo "$var is block"

    elif [ -d $var  ]

        then

            echo "$var is direcotry"

    elif [ -h $var  ]

        then

            echo "$var is symlink"

    else

        echo "$var is unkown"

    fi

    [root@u test]#

    [root@u test]# ./2.sh /etc

    /etc

     is regular file

    [root@u test]#

    Is前面没有路径,需要加上,于是用vim 2.sh然后按esc后输入::%s /var/1/g,就可以把var变成1

     

    # !/bin/bash

    echo $1

    if [ -f $var  ]

        then

            echo "$var is regular file"

    elif [ -b $var  ]

        then

            echo "$var is block"

    elif [ -d $var  ]

        then

            echo "$var is direcotry"

    elif [ -h $var  ]

        then

            echo "$var is symlink"

    else

        echo "$var is unkown"

    fi

    ~                                                        

    ~              

    :%s /var/1/g

    [root@u test]# ./2.sh /etc

    /etc

    /etc is direcotry

    [root@u test]#

    放到/usr/bin,就可以在任何一个文件夹运行2.sh

    [root@u test]# cp 2.sh /usr/bin/

    [root@u test]# cd

    [root@u ~]# 2.sh /etc

    /etc

    /etc is direcotry

    [root@u ~]#

    如果放到profile中,就是永久保存

    如果把脚本写到终端上,就要用分号

    [root@u ~]# x=1

    [root@u ~]# if [ $x -eq 1 ];then echo 'x is 1';fi

    x is 1

    [root@u ~]#

    [root@u test]# cat 5.sh

    #test.sh

    echo $0

    echo $1

    echo $2

    echo $3

    echo ${11}

    echo '$$' $$

    echo '$*' $*

    echo '$@' $@

    echo '$#' $#

    echo '$?' $?

    [root@u test]#

    [root@u test]# ./5.sh 1 2 3 4 5 6 7 8 9 10 11

    ./5.sh     ($0就是./5.sh)

    1

    2

    3

    11

    $$ 2236   (进程号,kill -9 2236就会杀掉,如果要睡眠10000秒,就sleep 10000)

    $* 1 2 3 4 5 6 7 8 9 10 11

    $@ 1 2 3 4 5 6 7 8 9 10 11

    $# 11    (多少个参数)

    $? 0      ($# 11这个执行成功没有)

    [root@u test]#

    查看nginx的状态:

    [root@u test]# systemctl status nginx

    开启:systemctl start nginx

    写一个脚本,看是否正在启动nginx,如果没,就开启

    红色这行的干扰项,需要去掉,用grep -v 'grep'

    [root@u test]# ps aux | grep nginx

    root        925  0.0  0.2 122808  2080 ?        Ss   12月11   0:00 nginx: master process /usr/sbin/ngin

    nginx       927  0.0  0.3 125324  3524 ?        S    12月11   0:00 nginx: worker process

    root       2587  0.0  0.0 112676   980 pts/0    R+   00:00   0:00 grep --color=auto nginx

    [root@u test]# ps aux | grep nginx | grep -v 'grep'

    root        925  0.0  0.2 122808  2080 ?        Ss   12月11   0:00 nginx: master process /usr/sbin/nginx

    nginx       927  0.0  0.3 125324  3524 ?        S    12月11   0:00 nginx: worker process

    [root@u test]#

    [root@u test]# vim ningx_check.sh (名字不能带nginx,否则脚本的语句判断出错)

    [root@u test]# cat ningx_check.sh

    #!/bin/bash

    ps aux | grep nginx | grep -v 'grep'

    if [ $? -ne 0 ]

    then

        systemctl start nginx

    fi

    [root@u test]# chmod +x ningx_check.sh

    [root@u test]# systemctl stop nginx

    [root@u test]# systemctl status nginx

    [root@u test]# ./ningx_check.sh

    [root@u test]# systemctl status nginx

    [root@u ~]# var=10

    [root@u ~]# awk -v x=$var '{print x}' b.txt

    10

    10

    10

    10

    10

    10

    10

    10

    10

    10

    [root@u ~]#

  • 相关阅读:
    几种常见的Map的区别
    BlockingQueue详解
    Android开发过程中内存泄露检测
    Android studio 技巧设置(持续更新中)
    Android Support兼容包详解
    单例模式的饿汉式为什么需要双重锁定
    View分析
    Activity的启动流程分析
    LeetCode第十四题-字符串数组中最长的共同前缀
    LeetCode第十三题-将罗马数字转化为数字
  • 原文地址:https://www.cnblogs.com/jensenxie/p/8052111.html
Copyright © 2011-2022 走看看