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 ~]# 
  • 相关阅读:
    NPOI json转Excel DataTable转Excel ,Excel转DataTable
    sqlhelper;
    C# DataSet数据导入Excel 修正版- .net FrameWork 4.0以上
    asp.net core 教程(七)-异常处理、静态文件
    asp.net core 教程(六)-中间件
    asp.net core 教程(五)-配置
    jQuery_3_过滤选择器
    jQuery_2_常规选择器-高级选择器2
    jQuery_2_常规选择器-高级选择器
    jQuery_2_常规选择器-进阶选择器
  • 原文地址:https://www.cnblogs.com/gaidy/p/11757441.html
Copyright © 2011-2022 走看看