• 变量的用法(未整理中的笔记)


    变量替换

    shell是弱类型语言,使用前不需要申明。image

    例1:从头匹配最短删除

    [root@localhost ~]# var1="I love you,Do you love me"
    [root@localhost ~]# echo ${var1#*ov}
    e you,Do you love me
    

    例2:从头匹配最长删除

    [root@localhost ~]# var1="I love you,Do you love me"
    [root@localhost ~]# echo ${var1##*ov}
    e me

    例3:后匹配最短删除

    [root@localhost ~]# echo ${var1%ov*}
    I love you,Do you l
    

    例4:从后匹配最长删除

    [root@localhost ~]# echo ${var1%%ov*}
    I l
    

    变量测试

    image

    expr代表字符串,以下以string代表expr为例

    注意使用expr索引下标从1开始

    #当变量str未赋值时为string
    [root@localhost ~]# echo ${str-string}
    string
    #当变量str为空时为空
    [root@localhost ~]# str=
    [root@localhost ~]# echo ${str-string}
    
    
    
    #当变量str赋值后为str的值
    [root@localhost ~]# str=123
    [root@localhost ~]# echo ${str-string}
    123
    

    以下类推,生产环境中不常用

    计算字符串长度

    语法1:${#string}

    语法2:expr length “$string”

    [root@localhost ~]# var="Hello World"
    [root@localhost ~]# echo ${#var}
    11
    [root@localhost ~]# echo `expr length "$var"`
    11
    

    获取字符串中索引位置

    获取字符的索引

    语法:expr index “$string” substr

    默认时将start切割成s,t,a,r,t字符依次去在var中查找

    所以uniq就被分割成u,n,i,q依次对比var变量中的第一个字符q,所以返回1

    #查找start在var中的位置
    [root@localhost ~]# var="quickstart is a app"
    [root@localhost ~]# echo `expr index "$var" start`
    6

    [root@localhost ~]# echo `expr index "$var" uniq`
    1

    获取子串的索引

    语法:expr match “$string” substr

    字串必须从头开始匹配

    [root@localhost ~]# echo $var
    quickstart is a app
    [root@localhost ~]# echo `expr match "$var" app`
    0
    [root@localhost ~]# echo `expr match "$var" quicks`
    6
    [root@localhost ~]# echo `expr match "$var" quickstart`
    10
    

    抽取字符串中的子串

    image

    例1:从第10位提取到最后,索引下标从0开始

    效果与例4一样

    [root@localhost ~]# var="kafka hadoop yarn mapreduce"
    [root@localhost ~]# echo ${var:10}
    op yarn mapreduce
    

    例2:从第10位开始提取5位字符

    [root@localhost ~]# echo ${var:10:5}
    op ya
    

    例3:从右往左提取5个字符,下标从1开始,注意冒号后有空格

    [root@localhost ~]# echo ${var: -5}
    educe
    

    从右往左提取的5个字符中提取长度为2的字符串

    [root@localhost ~]# echo ${var: -5:2}
    ed
    

    例5:从左往右第10个字符开始提取长度为5的字符串

    注意使用expr下标从1开始

    [root@localhost ~]# echo `expr substr "$var" 10 5`
    oop y
    

    小练习答案

    [root@localhost ShellScript]# cat 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 "* (5) 重新打印                        *"
            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}"
    }
    
    print_tips
    echo "【string=$string】"
    while true
    do
            read -p "Pls input your choice 1|2|3|4|5|q|Q :" choice
            case $choice in
                    1)
                            len_of_string
                            ;;
                    2)
                            del_hadoop
                            ;;
                    3)
                            rep_hadoop_mapreduce_first
                            ;;
                    4)
                            rep_hadoop_mapreduce_all
                            ;;
                    5)
                            print_tips
                            ;;
                    q|Q)
                            exit
                            ;;
                    *)
                            echo "Error,input only in {1|2|3|4|q|Q}"
                            ;;
                    esac
    done
    
    
    小练习答案

    命令替换

    $()就是命令替换

    $(())里面可以进行算术运算,如$( ( (100+30) /13) )

    ``和$()是等价的

    如:

    [root@localhost ShellScript]# num1=50
    [root@localhost ShellScript]# num2=70
    [root@localhost ShellScript]# echo "$((num1+num2))"
    120
    

    例1:遍历用户脚本

    -d指定分隔符,默认使用tab键作为分隔符,-f取第几段

    cat /etc/passwd | cut –d “:” –f 1
    [root@localhost ShellScript]# cat example_1.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
    

    例2:根据系统时间计算今年或明年

    [root@localhost ShellScript]# date
    2020年 02月 08日 星期六 20:33:28 CST
    [root@localhost ShellScript]# date +%Y
    2020
    [root@localhost ShellScript]# echo "This is $(($(date +%Y)+1)) year"
    This is 2021 year

    例3:根据系统时间获取今年还剩多少星期,已经过了多少星期

    data +%j为当前在一年中的多少天

    [root@localhost ShellScript]# date +%j
    039
    

    以上结果除以7就得到已经过了多少星期

    039取39除以7,039除以7会报错

    [root@localhost ~]# date=$(date +%j)
    [root@localhost ~]# echo $(( ${date:1:2} /7 ))
    5

    脚本输出结果

    [root@localhost ShellScript]# sh example_2.sh
    This year have passed 39 days
    This year have passed 5 weeks
    There is 326 days before new year
    There is 46 weeks before new year
    
    [root@localhost ShellScript]# cat example_2.sh
    #!/bin/bash
    date0=$(date +%j)
    date1=${date0:1:2}
    echo "This year have passed $date1 days"
    echo "This year have passed $(( $date1 /7 )) weeks"
    echo "There is $(( 365-$date1  )) days before new year"
    echo "There is $(( (365-$date1)/7 )) weeks before new year"
    
    脚本

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

    查看nginx进程

    注意最后一条是为ps这条命令显示的进程,实际nginx进程只有两条

    [root@localhost ShellScript]# ps -ef |grep nginx
    root      33823      1  0 00:44 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
    nginx     33824  33823  0 00:44 ?        00:00:00 nginx: worker process
    root      33978   8776  0 00:45 pts/2    00:00:00 grep --color=auto nginx

    过滤掉grep 的进程

    [root@localhost ShellScript]# ps -ef |grep nginx | grep -v grep
    root      33823      1  0 00:44 ?        00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
    nginx     33824  33823  0 00:44 ?        00:00:00 nginx: worker process
    

    统计进程条数

    [root@localhost ShellScript]# ps -ef |grep nginx | grep -v grep | wc -l
    2
    
    [root@localhost ShellScript]# cat example_3.sh
    #!/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
    
    脚本

    有类型变量

    declare命令typeset命令申明

    两者等价

    都是定义变量类型

    参数列表

    image

    默认未申明的变量都以字符串处理

    [root@localhost ShellScript]# num1=10
    [root@localhost ShellScript]# num2=$num1+20
    [root@localhost ShellScript]# echo $num2
    10+20

    虽然num1是字符串,但是num2申明为整型,所以结果会转为整型

    [root@localhost ShellScript]# declare -i num2
    [root@localhost ShellScript]# num2=$num1+20
    [root@localhost ShellScript]# echo $num2
    30

    使用expr命令计算

    [root@localhost ShellScript]# expr $num1 + 10
    20
    

    declare -f跟declare -F什么也不显示,可能我的centos7.4系统没有定义函数

    换ubuntu,可以看到。

    申明环境变量,全局可引用

    如果不声明var为环境变量,只能在当前终端使用

    [root@localhost ShellScript]# var=1
    [root@localhost ShellScript]# declare -x var
    [root@localhost ShellScript]# sh var.sh
    1
    
    #var.sh脚本内容为
    #!/bin/bash
    echo $var
    

    取消申明的环境变量

    环境变量var变为普通变量

    [root@localhost ShellScript]# declare +x var

    数组

    输出数组所有内容

    [root@localhost ShellScript]# declare -a array
    [root@localhost ShellScript]# array=("jones" "mike" "kobe" "jordan")
    [root@localhost ShellScript]# echo ${array[@]}
    jones mike kobe jordan
    

    下标是从0开始的

    [root@localhost ShellScript]# echo ${array[0]}
    jones
    

    输出整个数组元素的个数

    [root@localhost ShellScript]# echo ${#array[@]}
    4
    

    输出第一个元素的长度

    [root@localhost ShellScript]# echo ${#array[0]}
    5
    

    给数组赋值

    array[0]=”lily”

    删除元素

    unset array[2]
    unset array
    

    分片访问

    显示数组下标索引从1到3的3个元素

    ${array[@]:1:4}

    内容替换

    ${array[@]/an/AN}

    数组遍历

    for v in ${array{@}}
    do
    	echo $v
    done
    今天的学习是为了以后的工作更加的轻松!
  • 相关阅读:
    Android Studio 1.0 初体验
    JAVA笔记:死锁的详细解释
    JAVA笔记:多线程的理解及应用(三)
    JAVA笔记:多线程的理解及应用(二)
    JAVA笔记:多线程的理解及应用(一)
    mysql 中文编码
    k8s删除node
    k8s 卸载
    kubernetes 集群master变更ip地址
    docker常用指令
  • 原文地址:https://www.cnblogs.com/tz90/p/12274816.html
Copyright © 2020-2023  润新知