zoukankan      html  css  js  c++  java
  • 1.shell编程-变量的高级用法

    1.1.变量替换

    变量替换的六种形式

    实例:非贪婪和贪婪的区别

    从头部删除

    [root@VM_0_9_centos shell_learn]# var_1="i love you,do you love me"
    [root@VM_0_9_centos shell_learn]# echo $var_1
    i love you,do you love me
    [root@VM_0_9_centos shell_learn]# var1=${var_1#*ov}
    [root@VM_0_9_centos shell_learn]# echo $var1
    e you,do you love me
    [root@VM_0_9_centos shell_learn]# var2=${var_1##*ov}
    [root@VM_0_9_centos shell_learn]# echo $var2
    e me
    [root@VM_0_9_centos shell_learn]# 

     从尾部删除

    [root@VM_0_9_centos shell_learn]# var_1="i love you,do you love me"
    [root@VM_0_9_centos shell_learn]# echo $var_1
    i love you,do you love me
    [root@VM_0_9_centos shell_learn]# var3=${var_1%ov*}
    [root@VM_0_9_centos shell_learn]# echo $var3
    i love you,do you l
    [root@VM_0_9_centos shell_learn]# var4=${var_1%%ov*}
    [root@VM_0_9_centos shell_learn]# echo $var4
    i l
    [root@VM_0_9_centos shell_learn]# 

     字符串替换,把bin替换成大写的BIN,单斜线和双斜线的区别

    [root@VM_0_9_centos shell_learn]# echo $PATH
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
    [root@VM_0_9_centos shell_learn]# 
    [root@VM_0_9_centos shell_learn]# var5=${PATH/bin/BIN}
    [root@VM_0_9_centos shell_learn]# echo $var5
    /usr/local/sBIN:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
    [root@VM_0_9_centos shell_learn]# 
    [root@VM_0_9_centos shell_learn]# var6=${PATH//bin//BIN}
    [root@VM_0_9_centos shell_learn]# echo $var6
    /usr/local/s/BIN:/usr/local//BIN:/usr/s/BIN:/usr//BIN:/root//BIN
    [root@VM_0_9_centos shell_learn]#

    1.2.字符串处理

    计算字符串长度

    方法一

    ${#string}

    方法二

    string有空格,则必须加双引号

    expr length "$string"    

    实例

    [root@VM_0_9_centos shell_learn]# var1="hello world"
    [root@VM_0_9_centos shell_learn]# len=${#var1}
    [root@VM_0_9_centos shell_learn]# echo $len
    11
    [root@VM_0_9_centos shell_learn]# len2=`expr length "$var1"`
    [root@VM_0_9_centos shell_learn]# echo $len2
    11
    [root@VM_0_9_centos shell_learn]# 

    获取子串在字符串中的索引位置

    expr index $string $substring

    实例

    [root@VM_0_9_centos shell_learn]# var1="quickstart is a app"
    [root@VM_0_9_centos shell_learn]# index=`expr index "$var1" start`
    [root@VM_0_9_centos shell_learn]# echo $index
    6
    [root@VM_0_9_centos shell_learn]# index2=`expr index "$var1" uniq`
    [root@VM_0_9_centos shell_learn]# echo $index2
    1
    [root@VM_0_9_centos shell_learn]# index3=`expr index "$var1" cnk`
    [root@VM_0_9_centos shell_learn]# echo $index3
    4
    [root@VM_0_9_centos shell_learn]# 

    会把子串分割成一个一个字符,index是最先找到的那个字符的位置。

    计算子串长度

    expr match $string substr

     实例

    [root@VM_0_9_centos shell_learn]# var1="quickstart is a app"
    [root@VM_0_9_centos shell_learn]# len=`expr match "$var1" quic`
    [root@VM_0_9_centos shell_learn]# echo $len
    4
    [root@VM_0_9_centos shell_learn]# len=`expr match "$var1" app`
    [root@VM_0_9_centos shell_learn]# echo $len
    0
    [root@VM_0_9_centos shell_learn]# len=`expr match "$var1" quic.*`
    [root@VM_0_9_centos shell_learn]# echo $len
    19
    [root@VM_0_9_centos shell_learn]# 

    必须从开头匹配才可以

    抽取子串

     实例

    [root@VM_0_9_centos shell_learn]# var1="kafka hadoop yarn mapreduce"
    [root@VM_0_9_centos shell_learn]# sub1=${var1:10}
    [root@VM_0_9_centos shell_learn]# echo $sub1
    op yarn mapreduce
    [root@VM_0_9_centos shell_learn]# sub2=${var1:10:5}
    [root@VM_0_9_centos shell_learn]# echo $sub2
    op ya
    [root@VM_0_9_centos shell_learn]# sub3=${var1: -5}
    [root@VM_0_9_centos shell_learn]# echo $sub3
    educe
    [root@VM_0_9_centos shell_learn]# sub4=${var1:(-6)}
    [root@VM_0_9_centos shell_learn]# echo $sub4
    reduce
    [root@VM_0_9_centos shell_learn]# sub5=${var1: -5:3}
    [root@VM_0_9_centos shell_learn]# echo $sub5
    edu
    [root@VM_0_9_centos shell_learn]# sub6=`expr substr "$var1" 10 5`
    [root@VM_0_9_centos shell_learn]# echo $sub6
    oop y
    [root@VM_0_9_centos shell_learn]# 

     注意:使用expr索引是从1开始计算,使用${string:position},索引从0开始计算。

    1.3.字符串处理完整脚本

    思路分析

    1.将不同的功能模块划分,并编写函数
        function print_tips
        function len_of_string
        function del_hadoop
        function rep_hadoop_mapreduce_first
        function rep_hadoop_maapreduce_all
    
    2.实现第一步所定义的功能函数
    
    3.程序主流程的设计

    vim example.sh

    #!/bin/bash
    
    string="Bigdata process framework is Hadoop,Hadoop is an open source project"
    
    function print_tips
    {
        echo "******************************"
        echo "(1)打印string长度"
        echo "(2)删除字符串中所有的Hadoop"
        echo "(3)替换第一个Hadoop为Mapreduce"
        echo "(4)替换全部Hadoop为Mapreduce"
        echo "*******************************"        
    }
    
    function len_of_string
    {
        echo "${#string}"    
    }
    
    function del_hadoop
    {
        echo "${string//Hadoop/}"
    }
    
    function rep_hadoop_mapreduce_first
    {
        echo "${string/Hadoop/Mapreduce}"
    }
    
    function rep_hadoop_mapreduce_all
    {
            echo "${string//Hadoop/Mapreduce}"
    }
    
    while true
    do
        echo "[string=$string]"
        echo
        print_tips
        read -p "Pls input your choice(1|2|3|4|q|Q): " choice
        
        case $choice in
            1)
                len_of_string
                ;;
            2)
                del_hadoop
                ;;
            3)
                rep_hadoop_mapreduce_first
                ;;
            4)
                rep_hadoop_mapreduce_all
                ;;
            q|Q)
                exit
                ;;
            *)
                echo "Error,input only in {1|2|3|4|q|Q|}"
                ;;
        esac
    done

    sh example.sh

    1.4.命令替换

    语法格式

    方法一:
    `command`
    
    方法二:
    $(command)

    实例一:获取系统所有的用户并输出

    cat /etc/passwd | cut -d ":" -f 1

    vim example2.sh

    #!/bin/bash
    #
    
    index=1
    for user in `cat /etc/passwd | cut -d ":" -f 1`
    do 
        echo "This is $index user: $user"
        index=$(($index+1))
    
    done

    结果

     实例二:根据当前当前时间计算今年和明年

    $(());两个括号主要用来进行整数运算

    [root@VM_0_9_centos shell_learn]# date
    Wed Jun 26 21:58:04 CST 2019
    [root@VM_0_9_centos shell_learn]# date +%Y
    2019
    [root@VM_0_9_centos shell_learn]# echo "This is $(date +%Y) year"
    This is 2019 year
    [root@VM_0_9_centos shell_learn]# echo "This is $(($(date +%Y) + 1)) year"
    This is 2020 year
    [root@VM_0_9_centos shell_learn]# 

    实例三:根据当前时间获取今年还剩下多少星期和已经过了多少星期

    [root@VM_0_9_centos shell_learn]# date +%j
    177
    [root@VM_0_9_centos shell_learn]# echo "This yaer have passed $(date +%j) days"
    This yaer have passed 177 days
    [root@VM_0_9_centos shell_learn]# echo "This yaer have passed $(($(date +%j)/7)) weeks"
    This yaer have passed 25 weeks
    [root@VM_0_9_centos shell_learn]# echo "今年还剩下$(((365 - $(date +%j))/7))星期"
    今年还剩下26星期
    [root@VM_0_9_centos shell_learn]#

     实例四:判断nginx进程是否存在,若不存在则自动拉起该进程

    [root@VM_0_9_centos shell_learn]# ps -ef |grep nginx
    root      6658     1  0 22:33 ?        00:00:00 nginx: master process /usr/sbin/nginx
    nginx     6659  6658  0 22:33 ?        00:00:00 nginx: worker process
    root      6891   501  0 22:35 pts/0    00:00:00 grep --color=auto nginx
    [root@VM_0_9_centos shell_learn]# ps -ef |grep nginx |grep -v grep |wc -l
    2
    [root@VM_0_9_centos shell_learn]# systemctl stop nginx
    [root@VM_0_9_centos shell_learn]# 
    [root@VM_0_9_centos shell_learn]# ps -ef |grep nginx |grep -v grep |wc -l
    0
    [root@VM_0_9_centos shell_learn]# sh example3.sh 
    [root@VM_0_9_centos shell_learn]# 
    [root@VM_0_9_centos shell_learn]# ps -ef |grep nginx |grep -v grep |wc -l
    2
    [root@VM_0_9_centos shell_learn]#

    vim example3.sh

    如果nginx的进程个数为0,则拉起该进程

    #!/bin.bash
    #
    
    nginx_process_num=$(ps -ef | grep nginx | grep -v grep | wc -l)
    
    if [ $nginx_process_num -eq 0 ];then
        systemctl start nginx
    fi

    1.5.有类型变量

    declare和typeset命令

    • declare和typeset命令两者等价
    • declare和typeset命令都是用来定义变量类型的

    取消申明的变量

    declare +r
    declare +i
    declare +a
    declare +x

    实例一:-r 将变量设为只读

    [root@VM_0_9_centos shell_learn]# var1="hello world"
    [root@VM_0_9_centos shell_learn]# var1="hello python"
    [root@VM_0_9_centos shell_learn]# echo $var1
    hello python
    [root@VM_0_9_centos shell_learn]# declare -r var1
    [root@VM_0_9_centos shell_learn]# var1="hello go"
    -bash: var1: readonly variable
    [root@VM_0_9_centos shell_learn]# 

    实例二:-i 将变量设为整数

    shell中如果不声明,默认当做字符串处理

    [root@VM_0_9_centos shell_learn]# num1=10
    [root@VM_0_9_centos shell_learn]# num2=$num1+20
    [root@VM_0_9_centos shell_learn]# echo $num2
    10+20
    [root@VM_0_9_centos shell_learn]# declare -i num2
    [root@VM_0_9_centos shell_learn]# num2=$num1+20
    [root@VM_0_9_centos shell_learn]# echo $num2
    30
    [root@VM_0_9_centos shell_learn]#

    实例三:-a 将变量定义为数组

    定义数组

    [root@VM_0_9_centos shell_learn]# declare -a array
    [root@VM_0_9_centos shell_learn]# array=("jones" "mike" "kobe" "jordan")

    输出数组所有的内容

    [root@VM_0_9_centos shell_learn]# echo ${array[@]}
    jones mike kobe jordan

    第一个元素

    [root@VM_0_9_centos shell_learn]# echo ${array[0]}
    jones

    数组长度

    [root@VM_0_9_centos shell_learn]# echo ${#array[@]}
    4

    删除元素

    [root@VM_0_9_centos shell_learn]# unset array

    1.6.Bash数学运算之expr

    语法格式

     

    需要加转义字符“”

    [root@VM_0_9_centos shell_learn]# num1=30
    [root@VM_0_9_centos shell_learn]# num2=40
    [root@VM_0_9_centos shell_learn]# expr $num1 > $num2
    0
    [root@VM_0_9_centos shell_learn]# expr $num1 < $num2
    1
    [root@VM_0_9_centos shell_learn]# expr $num1 + $num2
    70
    [root@VM_0_9_centos shell_learn]# expr $num1 - $num2
    -10
    [root@VM_0_9_centos shell_learn]# expr $num1 * $num2
    expr: syntax error
    [root@VM_0_9_centos shell_learn]# expr $num1 * $num2
    1200

    1.7.Bash数学运算之bc

    bc是bash内建的运算器,支持浮点数运算。内建变量scale可以设置,默认为0.

    [root@VM_0_9_centos ~]# echo "23+35" | bc
    58
    [root@VM_0_9_centos ~]# echo "23.3+35" | bc
    58.3
    [root@VM_0_9_centos ~]# echo "scale=3;23.3/3.5" | bc
    6.657
    [root@VM_0_9_centos ~]# 
  • 相关阅读:
    Atitit.Java exe bat  作为windows系统服务程序运行
    Atitit. Object-c语言 的新的特性  attilax总结
    Atitit. Object-c语言 的新的特性  attilax总结
    Atitit。Time base gc 垃圾 资源 收集的原理与设计
    Atitit。Time base gc 垃圾 资源 收集的原理与设计
    Atitit.go语言golang语言的新的特性  attilax总结
    Atitit.go语言golang语言的新的特性  attilax总结
    Atitit.pdf 预览 转换html attilax总结
    Atitit.pdf 预览 转换html attilax总结
    Atitit.office word  excel  ppt pdf 的web在线预览方案与html转换方案 attilax 总结
  • 原文地址:https://www.cnblogs.com/gaidy/p/11757441.html
Copyright © 2011-2022 走看看