zoukankan      html  css  js  c++  java
  • 变量的用法(未整理中的笔记)

    变量替换

    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
    今天的学习是为了以后的工作更加的轻松!
  • 相关阅读:
    设计模式学习总结系列应用实例
    【研究课题】高校特殊学生的发现及培养机制研究
    Linux下Oracle11G RAC报错:在安装oracle软件时报file not found一例
    python pro practice
    openstack python sdk list tenants get token get servers
    openstack api
    python
    git for windows
    openstack api users list get token get servers
    linux 流量监控
  • 原文地址:https://www.cnblogs.com/tz90/p/12274816.html
Copyright © 2011-2022 走看看