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

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    入门shell脚本基础及原理

    1.特殊变量

    $#:查看变量参数的个数
    $0:查看脚本的名字
    $!:查看shell后台的pid
    $@:查看传递脚本所有参数的列表
    $*:查看所有参数的列表,单字符串形式显示
    $$:脚本本身进程的ID
    $?:上一条命令的结果,显示0则成功,不是0则失败

    2.内部环境变量

    $PATH 
    SHELL           当前使用的shell
    UID 			当前的用户环境 {0|其它数字}={root|其它用户}
    HOME            当前使用的用户目录
    PWD        		当前的目录	
    HISTFILE       	历史命令路径
    PS1					#[\u@\h \W]\$    用户@主机名\目录\$
    

    3.整数以及字符判断

    3.1整数判断

    -eq       测试俩个整数是否相等      (equal)
    -ne       测试俩个整数是否不等		(unequal)
    -gt       测试一个数是否大于一个数 (greater than)
    -lt		  测试一个数是否小于一个数 (less than)
    -ge	      测试一个数大于或等于 
    -le       测试一个数小于或等于
    

    3.2字符测试

    =~   测试是否被正则表达式匹配
    -z "string" 检测字符是否为空,空则真,不空则假    如: [ -z "" ]为真空则为真
    -n "string" 检测字符是否不空,不空则真,不空则假
    字符相比较大小用[[  ]],比的是第一个字母(a-zA-Z)都是大写或者都是小写比较ascii值 越大则越大
    有大写又有小写则A>a B>b   但是A不大于b的情况
    [root@slave02 ~]# [[ "A"  "B" ]]
    [root@slave02 ~]# echo $?
    0
    [root@slave02 ~]# [[ "a"  "b" ]]
    [root@slave02 ~]# echo $?
    0
    

    4.文件判断

    -e:文件是否存在   
    -b:测试是否块设备文件
    -c:测试是否字符设备文件
    -f:测试是否普通文件
    -d:测试是否目录
    -h:测试是否符号链接文件
    -L:测试是否是符号链接文件
    -p:测试是否是命名管道文件
    -S:测试是否是套接字文件
    权限相关:
    -r 读
    -w 写
    -x 执行
    特殊权限
    -g
    -u
    -k
    等
    

    5.read输入

    选项:
    -p:指定提示符
    -t:指定提示等待的时间(秒)
    

    6.if判断

    多分支:
    if [ 条件 ];then
    	statement1
    ​	.....
    elif  [ 条件2 ];then
    ​	statement2
    ​	....
    else
    ​	statement3
    ​	....
    fi
    

    7.案例选择判断

    case $变量名 in            
    	'value1')                
    		 statement                
    		 ...                
     ;;            
    	'value2')                
     		statement                
     		...                
     ;;            
    *)                
     		statement                
     		..                
     ;;        
    esac
    
    #case支持的通配符:
        *           //任意长度任意字符
        ?           //任意单个字符
        []          //指字范围内的任意单个字符
       start|START  //俩种选择
    

    8.for循环

    第一种:
    for  ((expr1;expr2;expr3))      # expr1:初始值条件  
    								#expr2:循环的范围进行退出  
    								#expr3:变量的值使用
    {
    ​	循环体
    }
    for ((expr1;expr2;expr3));do            
    ​	循环体
    done
    第二种:
    for  变量  in 列表; do
    ​	循环体
    done
    

    9.while循环

    while循环用于不知道循环次数的场景,注意有退出条件
    while [ 条件 ];do
    	statement
    	.....
    done
    

    10.深入练习

    1.写一个脚本,输入三个数字进行相应的加减乘除

    [root@slave02 ~]# cat script01.sh 
    #!/bin/bash
    a=$1
    b=$2
    c=$3
    num1=$[$a+$b+$c]
    num2=$[$a-$b-$c]
    num3=$[$a*$b*$c]
    echo "$a + $b + $c" = $num1
    echo "$a - $b - $c" = $num2
    echo "$a * $b * $c" = $num3
    awk "BEGIN{printf \"$a/$b/$c=%.2f\n\",$a/$b/$c}"
    [root@slave02 ~]# source script01.sh 100 10 9
    100 + 10 + 9 = 119
    100 - 10 - 9 = 81
    100 * 10 * 9 = 9000
    100/10/9=1.11
    

    2.猜数字游戏

    规则:指定一个数字,只要猜到了这个数字则过关,否则显示数字大了或者数字小了

    [root@master ~]# cat test03.sh 
    #!/bin/bash
    nums=99
    read -p "please enter a number: " num
    if [ $num -gt $nums ];then
            echo "数字大了"
    elif [ $num -lt $nums ];then
            echo "数字小了"
    else
            echo "猜对"
    fi        
    [root@master ~]# . test03.sh 
    please enter a number: 10
    数字小了
    [root@master ~]# . test03.sh
    please enter a number: 100
    数字大了
    [root@master ~]# . test03.sh
    please enter a number: 99
    猜对
    

    3.写一个脚本,让nginx服务设置开机自启

    #$0是nginx本身 $1是变量对应着下面的start|stop|restart|status
    [root@192 init.d]# pwd
    /etc/init.d
    [root@192 init.d]# cat nginx 
    #!/bin/bash
    case $1 in
            'start')
              /usr/local/nginx/sbin/nginx
              ;;
            'stop')
              /usr/local/nginx/sbin/nginx -s stop
              ;;
            'restart')
            /usr/local/nginx/sbin/nginx -s stop
            /usr/local/nginx/sbin/nginx
              ;;
            'status')
              num=$(ps -ef |grep -v 'grep'|grep -c nginx:)
              if [ $num -eq 0 ];then
                     echo "nginx is stoped" 
              else
                     echo "nginx is running"
              fi
              ;;
            *)
                  echo "Usage: service $0 start|stop|restart|status"
              ;;          
    esac
    		#当判断有nginx进程数量则认为开启服务,否则认为服务开启失败
    

    4.利用for循环,创建user序号1-100的用户

    #创建用户user1-100
    [root@master ~]# cat test05.sh 
    #!/bin/bash
    for (( i=1;i=100;i++));do
            useradd user$i
            id user$i >/dev/null
            if [ $? -eq 0 ];then  #只要判断用户成功,$?才会显示0,显示0则代表执行下一条命令,否则显示user以及存在
                    echo "success"
            else	
            		echo "user is exis"    
            fi
    done
    

    5.利用while循环,计算1+2…100的值

    [root@slave02 ~]# cat which.sh 
    #!/bin/bash
    s=0                 #初始值0
    i=1					#判断的数值,最终到100停止
    while [ $i -le 100 ];do
    s=$[$s+$i]			 
    i=$[$i+1]            #自增加数
    done
    echo $s
    [root@slave02 ~]# source which.sh 
    5050
    						#随便输入一个数字进行计算的话,把100改为$1即可
    

    6.apache简单的一个编译部署脚本

    1.一般项目或者脚本,文件,放在相应的位置里,方便查找
    [root@slave02 tmp]# pwd
    /tmp
    [root@slave02 tmp]# ls
    apache
    [root@slave02 apache]# ls
    install_apache.sh  soft
    [root@slave02 soft]# ls
    apr-1.7.0.tar.bz2   apr-util-1.6.1.tar.bz2    httpd-2.4.48.tar.bz2  httpd.service
    [root@slave02 apache]# cat install_apache.sh #!/bin/bash echo "欢迎使用此脚本" apachedir=/usr/local/apache if [ $UID -ne 0 ];then
            echo "伙计,请使用管理员身份运行"
    fi
    echo "正在安装依赖包..."
    yum -y install epel-release  bzip2 "@Development Tools"  >/dev/null
    yum -y install openssl-devel pcre-devel expat-devel libtool gcc gcc-c++ make  >/dev/null
    id apache >/dev/null
    if [ $? -ne 0 ];then
            useradd -r -M -s /sbin/nologin apache
    fi
    cd /tmp/apache/soft/
    tar -xf apr-1.7.0.tar.bz2
    tar -xf apr-util-1.6.1.tar.bz2
    tar -xf  httpd-2.4.48.tar.bz2
    sed -i '/ $RM "$cfgfile"/d' apr-1.7.0/configure
    echo "正在编译安装apr,请听听歌放松放松......." 
    cd apr-1.7.0/
    [ ! -d /usr/local/apr ]
    if [ $? -eq 0 ];then
            ./configure --prefix=/usr/local/apr  make  make install >/dev/null
    else
            echo "apr已经安装"
    fi
    cd ../apr-util-1.6.1/
    [ ! -d /usr/local/apr-util ]
    if [ $? -eq 0 ];then
            ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr  make  make install /dev/null
    else
            echo "apr-util已经安装"
    fi
    cd ../httpd-2.4.48/
    [ ! -d /usr/local/apache/ ]
    if [ $? -eq 0 ];then
    ./configure --prefix=$apachedir \
    
            --sysconfdir=/etc/httpd24 \
    
            --enable-so \
    
            --enable-ssl \
    
            --enable-cgi \
    
            --enable-rewrite \
    
            --with-zlib \
    
            --with-pcre \
    
            --with-apr=/usr/local/apr \
    
            --with-apr-util=/usr/local/apr-util/ \
    
            --enable-modules=most \
    
            --enable-mpms-shared=all \
    
            --with-mpm=prefork
            make  make install >/dev/null
    else
            echo "httpd已经安装"
    fi
    cd
    #有影响的加判断,没影响的忽略
    echo "export PATH=$apachedir/bin:\$PATH"   > /etc/profile.d/httpd.sh
    ln -s $apachedir/include/ /usr/include/apache >/dev/null
    grep 'apache/man' /etc/man_db.conf   >/dev/null
    
    if [ $? -eq 1 ];then
            sed -i "20aMANDATORY_MANPATH   $apachedir/man" /etc/man_db.conf
    else
            echo "apache is help exists"
    fi
    
    [ ! -f /usr/lib/systemd/system/httpd.service ]
    if  [ $? -eq 0 ];then
            cp /clq/apache/soft/httpd.service /usr/lib/systemd/system/
    else
            echo "已经存在文件跳过"
    fi
    systemctl daemon-reload
    systemctl enable --now httpd
    num02=$(ps -ef |grep -v 'grep'|grep -c httpd)
    if [ $num02 -eq 0 ];then
            echo "httpd自启失败"
    else
            echo "httpd自启成功"
    fi
    echo "欢迎下次使用"                                 
    [root@slave02 apache]# chmod +x install_apache.sh 
    [root@slave02 apache]# source install_apache.sh 
    [root@slave02 apache]# source install_apache.sh 
    欢迎使用此脚本
    正在安装依赖包...
    正在编译安装apr,请听听歌放松放松.......
    apr以及安装
    apr-util以及安装
    httpd已经安装
    apache is help exists
    已经存在文件跳过
    httpd自启成功
    欢迎下次使用
    [root@slave02 ~]# systemctl status httpd.service 
    ● httpd.service - Start http
       Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
       Active: active (running) since Sat 2021-09-04 17:45:33 CST; 5h 57min ago
     Main PID: 834761 (httpd)
        Tasks: 7 (limit: 5782)
       Memory: 6.3M
       CGroup: /system.slice/httpd.service
               ├─834761 /usr/local/apache/bin/httpd -k start
               ├─835358 /usr/local/apache/bin/httpd -k start
               ├─835359 /usr/local/apache/bin/httpd -k start
               ├─835360 /usr/local/apache/bin/httpd -k start
               ├─835361 /usr/local/apache/bin/httpd -k start
               ├─835362 /usr/local/apache/bin/httpd -k start
               └─836063 /usr/local/apache/bin/httpd -k start
    [root@slave02 ~]# ss -antl
    State         Recv-Q        Send-Q               Local Address:Port               Peer Address:Port        Process        
    LISTEN        0             128                        0.0.0.0:22                      0.0.0.0:*                          
    LISTEN        0             128                              *:80                            *:*                          
    LISTEN        0             128                           [::]:22                         [::]:*   
    

    以上就是入门shell脚本基础解析的详细内容,更多关于shell脚本的资料请关注脚本之家其它相关文章!

    您可能感兴趣的文章:
    • shell脚本语言的使用(超全超详细)
    • Linux Shell脚本系列教程(二):终端打印命令详解
    • Linux shell传递参数实现原理及代码实例
    • shell脚本4种执行方式
    • linux反弹shell的原理详解
    • 自己常用的一些shell脚本分享
    上一篇:Linux自定义防误删脚本的思路与测试
    下一篇:Shell获取当前正在执行脚本的绝对路径
  • 相关文章
  • 

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

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

    入门shell脚本基础及原理 入门,shell,脚本,基础,及,