变量的用法

一、变量替换

shell是弱类型语言,使用前不需要申明。变量的用法_第1张图片

例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

二、变量测试

变量的用法_第2张图片

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

四、获取字符串中索引位置

4.1 获取字符的索引

语法: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

4.2 获取子串的索引

语法: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

4.3 抽取字符串中的子串

变量的用法_第3张图片

例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命令申明

两者等价

都是定义变量类型

6.1 参数列表

变量的用法_第4张图片

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

[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


6.2 数组

输出数组所有内容

[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

你可能感兴趣的:(变量的用法)