• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    3000字扫盲shell基础知识(新手必备)

    不论前端还是后端,再学会Linux的基础上,还应该学会写一些简单的Shell。不止是工作,日常中想做一些东西,如果手动做就很累人也费时间,如果你会用Shell脚本处理就很简单了,本文普及的shell的一些基础知识。后面还会持续更新。

    shell基础语法之变量

    shell 变量命名

    定义变量:

    ➜ ~ name="xiaoka"
    ➜ ~ age=2

    无效的定义
    [

    root@iz2ze0ajic0vbv28hcdctpz hello]# 1212=sfds
    -bash: 1212=sfds: 未找到命令
    [root@iz2ze0ajic0vbv28hcdctpz hello]# ?aasd=hehe
    -bash: ?aasd=hehe: 未找到命令
    

    shell 变量调用

    变量的调用使用$符号或者$符号加上花括号。一般来讲使用花括号的用法。

    举例说明:

    [root@iz2ze0ajic0vbv28hcdctpz hello]# apple=hongfushi
    [root@iz2ze0ajic0vbv28hcdctpz hello]# echo $applepen
    
    [root@iz2ze0ajic0vbv28hcdctpz hello]# echo ${apple}pen
    hongfushipen
    

    如果不加花括号,就会读成applepen为一个变量,因此解析产生了歧义。

    shell 变量分类

    自定义变量:

    定义变量database:

    [root@iz2ze0ajic0vbv28hcdctpz hello]# database=mysql
    
    [root@iz2ze0ajic0vbv28hcdctpz hello]# echo $database
    mysql
    [root@iz2ze0ajic0vbv28hcdctpz hello]# echo ${database}
    mysql
    
    

    环境变量:查看全局环境变量:

    [root@iz2ze0ajic0vbv28hcdctpz ~]# printenv
    XDG_SESSION_ID=2044
    HOSTNAME=iz2ze0ajic0vbv28hcdctpz
    TERM=xterm-256color
    SHELL=/bin/bash
    HISTSIZE=1000
    SSH_CLIENT=113.44.42.209 56074 22
    SSH_TTY=/dev/pts/1
    USER=root
    LS_COLORS=rs=0:di=38;5;27:ln=38;5;51:mh=44;38;5;15:pi=40;38;5;11:so=38;5;13:do=38;5;5:bd=48;5;232;38;5;11:cd=48;5;232;38;5;3:or=48;5;232;38;5;9:mi=05;48;5;232;38;5;15:su=48;5;196;38;5;15:sg=48;5;11;38;5;16:ca=48;5;196;38;5;226:tw=48;5;10;38;5;16:ow=48;5;10;38;5;21:st=48;5;21;38;5;15:ex=38;5;34:*.tar=38;5;9:*.tgz=38;5;9:*.arc=38;5;9:*.arj=38;5;9:*.taz=38;5;9:*.lha=38;5;9:*.lz4=38;5;9:*.lzh=38;5;9:*.lzma=38;5;9:*.tlz=38;5;9:*.txz=38;5;9:*.tzo=38;5;9:*.t7z=38;5;9:*.zip=38;5;9:*.z=38;5;9:*.Z=38;5;9:*.dz=38;5;9:*.gz=38;5;9:*.lrz=38;5;9:*.lz=38;5;9:*.lzo=38;5;9:*.xz=38;5;9:*.bz2=38;5;9:*.bz=38;5;9:*.tbz=38;5;9:*.tbz2=38;5;9:*.tz=38;5;9:*.deb=38;5;9:*.rpm=38;5;9:*.jar=38;5;9:*.war=38;5;9:*.ear=38;5;9:*.sar=38;5;9:*.rar=38;5;9:*.alz=38;5;9:*.ace=38;5;9:*.zoo=38;5;9:*.cpio=38;5;9:*.7z=38;5;9:*.rz=38;5;9:*.cab=38;5;9:*.jpg=38;5;13:*.jpeg=38;5;13:*.gif=38;5;13:*.bmp=38;5;13:*.pbm=38;5;13:*.pgm=38;5;13:*.ppm=38;5;13:*.tga=38;5;13:*.xbm=38;5;13:*.xpm=38;5;13:*.tif=38;5;13:*.tiff=38;5;13:*.png=38;5;13:*.svg=38;5;13:*.svgz=38;5;13:*.mng=38;5;13:*.pcx=38;5;13:*.mov=38;5;13:*.mpg=38;5;13:*.mpeg=38;5;13:*.m2v=38;5;13:*.mkv=38;5;13:*.webm=38;5;13:*.ogm=38;5;13:*.mp4=38;5;13:*.m4v=38;5;13:*.mp4v=38;5;13:*.vob=38;5;13:*.qt=38;5;13:*.nuv=38;5;13:*.wmv=38;5;13:*.asf=38;5;13:*.rm=38;5;13:*.rmvb=38;5;13:*.flc=38;5;13:*.avi=38;5;13:*.fli=38;5;13:*.flv=38;5;13:*.gl=38;5;13:*.dl=38;5;13:*.xcf=38;5;13:*.xwd=38;5;13:*.yuv=38;5;13:*.cgm=38;5;13:*.emf=38;5;13:*.axv=38;5;13:*.anx=38;5;13:*.ogv=38;5;13:*.ogx=38;5;13:*.aac=38;5;45:*.au=38;5;45:*.flac=38;5;45:*.mid=38;5;45:*.midi=38;5;45:*.mka=38;5;45:*.mp3=38;5;45:*.mpc=38;5;45:*.ogg=38;5;45:*.ra=38;5;45:*.wav=38;5;45:*.axa=38;5;45:*.oga=38;5;45:*.spx=38;5;45:*.xspf=38;5;45:
    MAVEN_HOME=/usr/local/apache-maven-3.6.0
    MAIL=/var/spool/mail/root
    PATH=/usr/local/apache-maven-3.6.0/bin:/usr/local/jdk1.8.0_191/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
    PWD=/root
    JAVA_HOME=/usr/local/jdk1.8.0_191
    LANG=zh_CN.UTF-8
    HISTCONTROL=ignoredups
    SHLVL=1
    HOME=/root
    LOGNAME=root
    CLASSPATH=.:/lib/dt.jar:/lib/tools.jar
    SSH_CONNECTION=113.44.42.209 56074 172.17.187.244 22
    LC_CTYPE=zh_CN.UTF-8
    LESSOPEN=||/usr/bin/lesspipe.sh %s
    XDG_RUNTIME_DIR=/run/user/0
    _=/usr/bin/printenv
    

    定义一个环境变量

    [root@iz2ze0ajic0vbv28hcdctpz ~]# export kaka="kaka"
    [root@iz2ze0ajic0vbv28hcdctpz ~]# env |grep kaka
    kaka=kaka
    

    删除环境变量

    [root@iz2ze0ajic0vbv28hcdctpz ~]# unset kaka
    [root@iz2ze0ajic0vbv28hcdctpz ~]# env |grep kaka
    

    w如果长期使用,可以把它们写在配置文件中。/etc/profile 或者 用户家目录的.bash_profile

    位置变量 :

    我们先定义一个shell。

    [root@iz2ze0ajic0vbv28hcdctpz ~]# cat test.sh
    #!/bin/bash
    
    echo "执行的文件: $0"
    echo "第一个参数: $1"
    echo "第二个参数: $2"

    执行查看结果。

    [root@iz2ze0ajic0vbv28hcdctpz ~]# chmod +x test.sh
    [root@iz2ze0ajic0vbv28hcdctpz ~]# ./test.sh 1 2
    执行的文件: ./test.sh
    第一个参数: 1
    第二个参数: 2

    预定义变量:

    常用的预定义变量有如下几个。

    #!/bin/bash
    
    echo "执行的文件: $0"
    echo "第一个参数: $1"
    echo "第二个参数: $2"
    echo "所有参数: $*"
    echo "当前脚本的pid: $"
    echo "脚本参数个数: $#"

    查看执行结果

    [root@iz2ze0ajic0vbv28hcdctpz ~]# ./test.sh 1 2
    执行的文件: ./test.sh
    第一个参数: 1
    第二个参数: 2
    所有参数: 1 2
    当前脚本的pid: 30170
    脚本参数个数: 2

    查看上一个命令执行结果。

    [root@iz2ze0ajic0vbv28hcdctpz hello]# ls
    test
    [root@iz2ze0ajic0vbv28hcdctpz hello]# echo $?
    0

    shell 运算符

    shell也是一门语言其实和其他的语言运算符大同小异,不过这里我们还是来说一下。本节说一下运算符相关内容。

    运算符种类

    算数运算符

    命令: expr
    作用:   求表达式的值
    语法:    expr 表达式
    规则:

    操作:(先编写一个运算相关的shell脚本)

    #!/bin/bash
    i=1
    j=2
    addition=`expr $i + $j`
    subtraction=`expr $i - $j`
    multiplication=`expr $j \* $j`
    division=`expr $j / $i`
    mod=`expr $j % $i`
    echo "addition=${addition} , subtraction=${subtraction} , multiplication=${multiplication} , division=${division} , mod=${mod}"
    
    if [ $i == $j ]
    then
     echo "i 等于 j"
    fi
    
    if [ $i != $j ]
    then
     echo "i 不等于 j"
    fi

    查看结果:

    ➜  ~ ./operation.sh
    addition=3 , subtraction=-1 , multiplication=4 , division=2 , mod=0
    i 不等于 j

    关系运算符

    操作:(编写脚本)

    #!/bin/bash
    num1=5
    num2=8
    if [ $num1 -eq $num2 ]
    then
     echo "$num1 是否等于 $num2 : num1 等于 num2"
    else
     echo "$num1 是否等于 $num2: num1 不等于 num2"
    fi
    if [ $num1 -ne $num2 ]
    then
     echo "$num1 是否不等于 $num2: num1 不等于 num2"
    else
     echo "$num1 是否不等于 $num2 : num1 等于 num2"
    fi
    if [ $num1 -gt $num2 ]
    then
     echo "$num1 是否大于 $num2: num1 大于 num2"
    else
     echo "$num1 是否大于 $num2: num1 不大于 num2"
    fi
    if [ $num1 -lt $num2 ]
    then
     echo "$num1 是否小于 $num2: num1 小于 num2"
    else
     echo "$num1 是否小于 $num2: num1 不小于 num2"
    fi
    if [ $num1 -ge $num2 ]
    then
     echo "$num1 是否大于等于 $num2: num1 大于或等于 num2"
    else
     echo "$num1 是否大于等于 $num2: num1 小于 num2"
    fi
    if [ $num1 -le $num2 ]
    then
     echo "$num1 是否小于等于 $num2: num1 小于或等于 num2"
    else
     echo "$num1 是否小于等于 $num2: num1 大于 num2"
    fi
    

    操作结果:

    ➜  ~ ./relation.sh
    5 是否等于 8: num1 不等于 num2
    5 是否不等于 8: num1 不等于 num2
    5 是否大于 8: num1 不大于 num2
    5 是否小于 8: num1 小于 num2
    5 是否大于等于 8: num1 小于 num2
    5 是否小于等于 8: num1 小于或等于 num2

    布尔运算符

    编写脚本:

    #!/bin/bash
    num1=3
    num2=23
    if [ $num1 != $num2 ]
    then
     echo "$num1 != $num2 : num1 不等于 num2"
    else
     echo "$num1 != $num2: num1 等于 num2"
    fi
    if [ $num1 -lt 25 -a $num2 -gt 15 ]
    then
     echo "$num1 小于 25 且 $num2 大于 15 : 返回 true"
    else
     echo "$num1 小于 25 且 $num2 大于 15 : 返回 false"
    fi
    if [ $num1 -lt 25 -o $num2 -gt 25 ]
    then
     echo "$num1 小于 25 或 $num2 大于 25 : 返回 true"
    else
     echo "$num1 小于 25 或 $num2 大于 25 : 返回 false"
    fi
    

    查看结果:

    ➜  ~ ./bool.sh
    3 != 23 : num1 不等于 num2
    3 小于 25 且 23 大于 15 : 返回 true
    3 小于 25 或 23 大于 25 : 返回 true

    字符串运算符

    编写脚本:

    #!/bin/bash
    apple="apple"
    pen="pen"
    
    if [ $apple = $pen ]
    then
     echo "$apple = $pen : apple 等于 pen"
    else
     echo "$apple = $pen: apple 不等于 pen"
    fi
    if [ $apple != $pen ]
    then
     echo "$apple != $pen : apple 不等于 pen"
    else
     echo "$apple != $pen: apple 等于 pen"
    fi
    if [ -z $apple ]
    then
     echo "-z $apple : 字符串长度为 0"
    else
     echo "-z $apple : 字符串长度不为 0"
    fi
    if [ -n "$apple" ]
    then
     echo "-n $apple : 字符串长度不为 0"
    else
     echo "-n $apple : 字符串长度为 0"
    fi
    if [ $apple ]
    then
     echo "$apple : 字符串不为空"
    else
     echo "$apple : 字符串为空"
    fi

    执行结果:

    [root@iz2ze0ajic0vbv28hcdctpz ~]# ./string.sh
    apple = pen: apple 不等于 pen
    apple != pen : apple 不等于 pen
    -z apple : 字符串长度不为 0
    -n apple : 字符串长度不为 0
    apple : 字符串不为空

    逻辑运算符

    编写脚本:

    #!/bin/bash
    num1=5
    num2=8
    if [[ $num1 -lt 10  $num2 -gt 5 ]]
    then
     echo "返回 true"
    else
     echo "返回 false"
    fi
    
    if [[ $num1 -lt 10 || $num2 -gt 5 ]]
    then
     echo "返回 true"
    else
     echo "返回 false"
    fi
    
    

    执行结果:

    [root@iz2ze0ajic0vbv28hcdctpz ~]# ./logic.sh
    返回 true
    返回 true

    文件测试运算符

    编写脚本:

    ~ cat testfile.sh
    #!/bin/bash
    
    file="/root/testfile.sh"
    
    if [ -r $file ]
    then
     echo "该文件可读"
    else
     echo "该文件不可读"
    fi
    if [ -x $file ]
    then
     echo "该文件可执行"
    else
     echo "该文件不可执行"
    fi
    if [ -w $file ]
    then
     echo "该文件可写"
    else
     echo "该文件不可写"
    fi
    
    if [ -f $file ]
    then
     echo "该文件是普通文件"
    else
     echo "该文件是非普通文件"
    fi
    
    if [ -s $file ]
    then
     echo "该文件为空"
    else
     echo "该文件不为空"
    fi
    if [ -d $file ]
    then
     echo "该文件是目录"
    else
     echo "该文件不是目录"
    fi

    执行脚本:

    ➜  ~ ./testfile.sh
    该文件可读
    该文件可执行
    该文件可写
    该文件是普通文件
    该文件为空
    该文件不是目录

    shell条件判断流程控制

    其实流程控制的本质是差不多的,只是在语法上稍微有些差别,本节我们来盘一盘。

    单分支if

    流程示意图:

    举例:

    ➜ if cat if-one.sh
    #!/bin/bash
    a=10
    
    if [ a > 5 ]
    then
     echo "a 大于 5"
    fi
    
    

    执行结果:

    ➜  if ./if-one.sh
    a 大于 5

    双分支if

    流程示意图:

    举例:

    ➜ if cat if-double.sh
    #!/bin/bash
    age=18
    if [ $age -ge 18 ]; then
     echo "成年"
    else
     echo "未成年"
    fi
    

    执行结果:

    ➜  if ./if-double.sh
    成年

    多分支if语句

    流程示意图:

    举例:

    ➜ if cat if-multi.sh
    #!/bin/bash
    money=10
    if [ $money -lt 1 ]
    then
     echo "1块钱都没有的比皮卡丘决定在家吃土"
    elif [ $money -ge 1 -a $money -lt 5 ]
    then
     echo "老板我要大白兔奶糖"
    elif [ $money -ge 5 -a $money -le 10 ]
    then
     echo "老板我要巧克力"
    else
     echo "老板给我拿个鸡腿"
    fi
    

    执行结果:

    ➜  if ./if-multi.sh
    老板我要巧克力

    到此这篇关于3000字扫盲shell基础知识的文章就介绍到这了,更多相关shell入门内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • 一篇教会你写90%的shell脚本(入门小结)
    • linux shell(.sh)脚本编写和运行入门
    • Shell脚本编程30分钟入门(小结)
    • 分享一个入门级可控多线程shell脚本代码
    • Linux Shell 脚本编程入门教程
    • Linux Shell脚本系列教程(一):Shell入门
    • linux Shell入门:掌握Linux,OS X,Unix的Shell环境
    上一篇:浅谈Shell 流程控制
    下一篇:一个Shell小脚本精准统计Mysql每张表的行数实现
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    3000字扫盲shell基础知识(新手必备) 3000字,扫盲,shell,基础知识,