0%

Shell变量概述

Shell变量概述

什么是变量

变量是Shell传递数据的一种方法,简单理解:用一个固定的字符串去表示不固定的内容,便于后续引用。

变量命令规范

1
2
3
4
5
6
7
8
9
10
11
变量定义时名称有要求:字母、数字、下划线几个组成,尽量字母开头,变量名最好具备一定的含义。

ip=10.0.0.100

ip1=10.0.0.100

Hostname_Ip=10.0.0.100

hostname_IP=10.0.0.100

等号是赋值,需要注意:等号两边不能有空格,其次定义的变量不要与系统命令出现冲突。

Shell变量定义的方式

1
2
3
4
5
6
7
01)用户自定义变量:人为定义的变量名称。

02)系统环境变量:保存的是和系统操作环境相关的数据。

03)位置参数变量:向脚本中进行参数传递,变量名不能自定义,变量作用是固定的。

04)预定义的变量:是bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。

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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
整数运算

expr 值两边必须要有空格隔开

[root@shell shell]# expr 1 + 1
2
[root@shell shell]# num1=10
[root@shell shell]# num2=20
[root@shell shell]# expr $num1 + $num2
30
[root@shell shell]# expr $num1 - $num2
-10
[root@shell shell]# expr $num1 * $num2
expr: syntax error
[root@shell shell]# expr $num1 \* $num2
200
[root@shell shell]# expr $num1 / $num2
0
[root@shell shell]# expr $num2 / $num2
1
[root@shell shell]# expr $num2 % $num2
0
[root@shell shell]# expr $num1 % $num2
10


$(())

[root@shell shell]# echo $(( $num1 + $num2 ))
30
[root@shell shell]# echo $(( $num1 - $num2 ))
-10
[root@shell shell]# echo $(( $num1 * $num2 ))
200


$[]

[root@shell shell]# echo $[$num1 * $num2 ]
200
[root@shell shell]# echo $[$num1 / $num2 ]
0
[root@shell shell]# echo $[$num1 + $num2 ]
30



let ****

[root@shell shell]# a=1
[root@shell shell]# let a++
[root@shell shell]# echo $a
2
[root@shell shell]# let a++
[root@shell shell]# echo $a
3
[root@shell shell]# let a--
[root@shell shell]# echo $a
2

小数运算

bc awk python

bc
[root@shell shell]# yum install -y bc


[root@shell shell]# echo $num1 + $num2 |bc
30
[root@shell shell]# bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
10+20
30
^C
(interrupt) Exiting bc.
[root@shell shell]# echo $num1 - $num2 |bc
-10
[root@shell shell]# echo $num1 ^ $num2 |bc
100000000000000000000
[root@shell shell]# echo $num1 / $num2 |bc
0
[root@shell shell]# echo "scale=2;$num1 / $num2" | bc
.50
[root@shell shell]# echo "scale=1;$num1 / $num2" | bc
.5
[root@shell shell]# echo "scale=1; 20 / 6" | bc
3.3
[root@shell shell]#



awk

[root@shell shell]# awk 'BEGIN{print 20 * 10 }'
200
[root@shell shell]# awk 'BEGIN{print 20 ^ 10 }'
10240000000000
[root@shell shell]# awk 'BEGIN{print 20 / 6 }'
3.33333
[root@shell shell]# awk 'BEGIN{printf "%.2f\n", 20 / 6 }'
3.33


python

[root@shell shell]# echo "print $num1+$num2" | python
30
[root@shell shell]# echo "print $num1/$num2" | python
0
[root@shell shell]# echo "print ${num1}.0/$num2" | python
0.5


[root@shell shell]# python
Python 2.7.5 (default, Oct 30 2018, 23:45:53)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 10+20
30
>>> 30.0/9
3.3333333333333335
>>>


示例: 执行ps aux 进行计算VSZ这列的所有数的和

[root@shell shell]# ps aux | awk 'NR>1{print $5}' |tr "\n" "+" |sed -r 's#(.*)\+#\1\n#g' |bc
4431300


[root@shell shell]# ps aux | awk 'NR>1{print $5}' |tr "\n" "+" |sed -r 's#(.*)\+#\1\n#g' |bc
4301596
[root@shell shell]# ps aux | awk 'NR>1{print $5}' |awk '{i+=$1}END{print i}'
4306700

[root@shell shell]# seq 100| awk '{print $1}' |tr "\n" "+" |sed -r 's#(.*)\+#\1\n#g' |bc
5050
[root@shell shell]# seq 100| awk '{print $1}' |awk '{i+=$1}END{print i}'
5050

shell变量案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
使用Shell脚本打印,系统版本、内核版本平台、虚拟平台、静态主机名、eth0网卡IP地址、lo网卡IP地址、当前主机的外网IP地址curl -s  icanhazip.com


[root@shell shell]# cat varable.sh
#!/bin/bash
System=$(hostnamectl |awk '/System/{print $3,$4,$5}')
Kernel=$(hostnamectl |awk '/Kernel/{print $NF}')
Vm=$(hostnamectl |awk '/Virtua/{print $NF}')
Sh=$(hostnamectl |awk '/Static/{print $NF}')
Eth0=$(ifconfig eth0 |awk 'NR==2{print $2}')
Lo=$(ifconfig lo |awk 'NR==2{print $2}')
W_network=$(curl -s ifconfig.me)
echo "当前系统的版本为:$System"
echo "当前系统内核版本为:$Kernel"
echo "当前系统虚拟化平台为:$Vm"
echo "当前系统静态主机名为:$Sh"
echo "当前系统eth0ip地址为:$Eth0"
echo "当前系统loip地址为:$Lo"
echo "当前系统外网ip地址为:$W_network"