Shell变量的高级用法

一、变量替换

示例:

1、定义变量

1
va_1="i love you, do you love me?"

2、打印看看

1
echo $va_1

显示如下字符串: i love you, do you love me?

3、进行字符替换

1
var1=${va_1#*ov}

var1如下所示: e you, do you love me?

二、字符串处理

1、获取字符串长度

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

语法: expr index $string $substring

3、计算子串的长度

语法: expr match $string substr

4、抽取子串

三、小练习

问题如下:

Shell脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#!/usr/bin/env bash

string="Bigdata process framework is Hadoop,Hadoop is an open source project"

function tips_info
{
echo "******************************************"
echo "*** (1) 打印string长度"
echo "*** (2) 在整个字符串中删除Hadoop"
echo "*** (3) 替换第一个Hadoop为Mapreduce"
echo "*** (4) 替换全部Hadoop为Mapreduce"
echo "******************************************"
}

function print_len
{
if [ -z "$string" ];then
echo "Error,string is null"
exit 1
else
echo "${#string}"
fi
}

function del_hadoop
{
if [ -z "$string" ];then
echo "Error,string is null"
exit 1
else
echo "${string//Hadoop/}"
fi
}

function rep_hadoop_mapreduce_first
{
if [ -z "$string" ];then
echo "Error,string is null"
exit 1
else
echo "${string/Hadoop/Mapreduce}"
fi
}

function rep_hadoop_mapreduce_all
{
if [ -z "$string" ];then
echo "Error,string is null"
exit 1
else
echo "${string//Hadoop/Mapreduce}"
fi
}


while true
do

echo "【string=\"$string\"】"
tips_info
read -p "Please Switch a Choice: " choice
case "$choice" in
1)
echo
echo "Length Of String is: `print_len`"
echo
continue
;;
2)
echo
echo "删除Hadoop后的字符串为:`del_hadoop`"
echo
;;
3)
echo
echo "替换第一个Hadoop的字符串为:`rep_hadoop_mapreduce_first`"
echo
;;
4)
echo
echo "替换第一个Hadoop的字符串为:`rep_hadoop_mapreduce_all`"
echo
;;
q|Q)
exit 0
;;
*)
echo "error,unlegal input,legal input only in { 1|2|3|4|q|Q }"
continue
;;
esac
done

四、命令替换

一段命令的执行结果是另一个命令的一部分,类似于函数引用

  • 例子1

    获取系统所有用户并输出

    1
    2
    3
    4
    5
    6
    7
    8
    9
     #!/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

    查看系统nginx进程是否存在,若不存在就启动它

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/bash
    #

    nginx_process_num=$(ps -ef | grep nginx | grep -v grep | wc -l)

    echo "nginx_process_num = $nginx_process_num"

    if [ $nginx_process_num -eq 0 ];then
    systemctl start nginx
    fi

五、有类型变量

1、declare命令

六、数学运算

1、expr命令

2、expr操作符对照表(上)

注意!当使用两变量做比较使用 |、&、<、>、<=、>=符号的时候,需要进行转义,如下:

1
expr $num1 \>= $num2

3、expr操作符对照表(下)

1
num3=`expr $num1 + $num2`

4、小练习

提示用户输入一个正整数num,然后计算1+2+3+4+···+num的值,必须对num是否为正整数做判断,不符合的话应当进行再输入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/bash
#

while true
do
read -p "pls input a positive number: " num

expr $num + 1 &> /dev/null

if [ $? -eq 0 ];then
if [ `expr $num \> 0` -eq 1 ];then
for((i=1;i<=$num;i++))
do
sum=`expr $sum + $i`
done
echo "1+2+3+....+$num = $sum"
exit
fi
fi
echo "error,input enlegal"
continue
done

Shell脚本中 $0、$?、$!、$$、$*、$#、$@等的意义说明:

  • $$

    Shell本身的PID(ProcessID,即脚本运行的当前 进程ID号)

  • $!

    Shell最后运行的后台Process的PID(后台运行的最后一个进程的 进程ID号)

  • $?

    最后运行的命令的结束代码(返回值)即执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)

  • $-

    显示shell使用的当前选项,与set命令功能相同

  • $*

    所有参数列表。如”$*”用「”」括起来的情况、以”$1 $2 … $n”的形式输出所有参数,此选项参数可超过9个

  • $@

    所有参数列表。如”$@”用「”」括起来的情况、以”$1” “$2” … “$n” 的形式输出所有参数

  • $@

    跟$*类似,但是可以当作数组用

  • $#

    添加到Shell的参数个数

  • $0

    Shell本身的文件名

  • $1~$n

    添加到Shell的各参数值。$1是第1参数、$2是第2参数…、

七、bc运算

简单介绍:

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

1、bc操作符对照表

1、加减乘除
2、求余以及指数运算

2、在脚本中使用bc

1
echo  "scale=4;23.33+24" | bc

|表示将前一条命令的输出,用作后一条命令的输入