1.shell变量是弱类型
* 声明变量不用声明类型
* 可以存储不同类型的内容
* 使用时要明确变量的类型
* 区分大小写
2 变量声明及赋值格式
2.1 格式
变量名=变量值 # 注意等号两侧不可有空格
2.2 举例
var="hello world"
3 变量的使用
3.1 格式
$变量名 或 ${变量名}
3.2 举例
var="Good boy"
echo $var #或者是echo ${var}
4 shell 变量的条件赋值
${变量1:+- 变量2};
(1) 冒号后面是“-”的话,或者没有(默认是“-”) 表示, 如果变量1的值为空, 就是使用变量2的
(2) 冒号后面是“+”的话, 表示变量不为空时, 使用变量2的值
这里的变量2可以是常量, 或者$变量
变量的条件赋值,
- 号:没有赋值则用变量2替换,-号不可省略,无空格
+ 号:赋值则采用变量2替换
? 号
测试如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
function
provisionUser()
{
#$1 user id, $2 data file, $3 log file.
#example: $1 sip:p_presentity_78@${PS_MAIN_DOMAIN}
# $2 presentity_78.data
# $3 DESC_01
# $4 local or remote
site=${4:-
local
}
}
#!/bin/bash
chinesename=
""
# chinsesname为空,则用kerry赋值,-号不可省略,没有空格
name=${chinesename:-kerry}
echo
$name
~
#!/bin/bash
chinesename=
"aaa"
#输出为kerry,为+号只有当变量已赋值时才用指定值替换,变量variable已赋值时,其值才用value替换,否则不进行任何替换。
name=${chinesename:+kerry}
echo
$name
|
定义数组两种方式:
第一种
name=(tom lucy lili),一对括号表示是数组,元素用空格分割,如果是逗号或者其他分割,数组中只有一个元素
1
2
3
4
5
6
7
8
9
|
[nxuser
@PSBJ
-
0
-
0
-
0
data]$ name=(
1
,
2
,
3
,
4
,
5
,
6
)
[nxuser
@PSBJ
-
0
-
0
-
0
data]$ echo ${#name[@]}
1
[nxuser
@PSBJ
-
0
-
0
-
0
data]$ name=(
1
2
3
4
5
6
)
[nxuser
@PSBJ
-
0
-
0
-
0
data]$ echo ${name[@]}
1
2
3
4
5
6
[nxuser
@PSBJ
-
0
-
0
-
0
data]$ echo ${#name[@]}
6
|
用${#数组名[@或*]} 可以得到数组长度
用${数组名[下标]} 下标是从0开始 下标是:*或者@ 得到整个数组内容
1
2
|
[nxuser
@PSBJ
-
0
-
0
-
0
data]$ echo ${name[
2
]}
3
|
直接通过 数组名[下标] 就可以对其进行引用赋值,如果下标不存在,自动添加新一个数组元素
1
2
3
4
5
6
7
8
9
10
11
12
|
[nxuser@PSBJ-0-0-0 data]$ a=(1 2 3 4 5 6 7 8 9)
[nxuser@PSBJ-0-0-0 data]$
echo
${a[*]}
1 2 3 4 5 6 7 8 9
[nxuser@PSBJ-0-0-0 data]$ a[1]=100
[nxuser@PSBJ-0-0-0 data]$
echo
${a[*]}
1 100 3 4 5 6 7 8 9
[nxuser@PSBJ-0-0-0 data]$ a[10]=100
[nxuser@PSBJ-0-0-0 data]$
echo
${a[*]}
1 100 3 4 5 6 7 8 9 100
[nxuser@PSBJ-0-0-0 data]$ a[18]=100
[nxuser@PSBJ-0-0-0 data]$
echo
${a[*]}
1 100 3 4 5 6 7 8 9 100 100
|
直接通过:unset 数组[下标] 可以清除相应的元素,不带下标,清除整个数据
1
2
3
4
5
6
7
8
9
|
[nxuser
@PSBJ
-
0
-
0
-
0
data]$ echo ${a[*]}
1
100
3
4
5
6
7
8
9
100
100
[nxuser
@PSBJ
-
0
-
0
-
0
data]$ unset a[
1
]
[nxuser
@PSBJ
-
0
-
0
-
0
data]$ echo ${a[*]}
1
3
4
5
6
7
8
9
100
100
[nxuser
@PSBJ
-
0
-
0
-
0
data]$ unset a
[nxuser
@PSBJ
-
0
-
0
-
0
data]$ echo ${a[*]}
[nxuser
@PSBJ
-
0
-
0
-
0
data]$
|
分片
直接通过 ${数组名[@或*]:起始位置:长度} 切片原先数组,返回是字符串,中间用“空格”分开,因此如果加上”()”,将得到切片数组,上面例子:c 就是一个新数据。
1
2
3
4
5
6
|
[nxuser
@PSBJ
-
0
-
0
-
0
data]$ b=(
11
,
22
,
33
,
44
,
55
,
66
)
[nxuser
@PSBJ
-
0
-
0
-
0
data]$ echo ${b[*]:
1
:
3
}
[nxuser
@PSBJ
-
0
-
0
-
0
data]$ b=(
11
22
33
44
55
66
)
[nxuser
@PSBJ
-
0
-
0
-
0
data]$ echo ${b[*]:
1
:
3
}
22
33
44
|
记住,数组元素是以空格分割的
替换
1
2
3
4
5
|
[nxuser@PSBJ-0-0-0 data]$ b=(11 22 33 44 55 66)
[nxuser@PSBJ-0-0-0 data]$
echo
${b[*]
/11/1111
}
1111 22 33 44 55 66
[nxuser@PSBJ-0-0-0 data]$
echo
${b[*]}
11 22 33 44 55 66
|
调用方法是:${数组名[@或*]/查找字符/替换字符} 该操作不会改变原先数组内容,如果需要修改,可以看上面例子,重新定义数据
1
2
3
|
[nxuser
@PSBJ
-
0
-
0
-
0
data]$ bb=${b[*]/
11
/
1111
}
[nxuser
@PSBJ
-
0
-
0
-
0
data]$ echo ${bb[@]}
1111
22
33
44
55
66
|
数组遍历
Shell循环如下:
1
2
3
4
5
6
|
for
VARIABLE in 1 2 3 4 5 .. N
do
command1
command2
commandN
done
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
for
循环的三个表达式
语法如下:
for
(( EXP1; EXP2; EXP3 ))
do
command1
command2
command3
done
while
expression
do
command
command
```
done
|
1
|
|
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
|
#!/bin/bash
name=(aa bb cc)
echo
"the length is"
${#name[*]}
echo
"the elements are"
${name[*]}
echo
"output the elements"
for
element in ${name[*]}
do
echo $element
done
count=
0
size=${#name[*]}
while
[ $count -le $size ]
do
echo ${name[$count]}
let count+=
1
done
下面也是正确的写法:
while
(( $count <= $size ))
do
echo ${name[$count]}
let count+=
1
done
但是如果写成:
while
( $count -le $size ) 是错误的
第三种写法如下:
for
(( count=
0
;count<=$size;count+=
1
))
do
echo ${name[$count]}
done
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#!/bin/bash
declare -a name
name[${#name[*]}]=aaa
name[${#name[*]}]=bbb
name[${#name[@]}]=ccc
for
element in ${name[*]}
do
echo $element
done
|
直接利用${数组名称}, 输出的是第一个元素,如下所示:
但是在python中是所有元素。
1
2
3
4
5
6
7
8
|
[nxuser
@PSjamsBond
-
0
-
0
-
0
~]$ ./testarray1.sh
the length is3
the elements areaa bb cc
output the elements
aa
bb
cc
the output
for
aa is :aa
|
Python循环如下:
while 判断条件: 执行语句……
for iterating_var in sequence: statements(s)
Python相关实现方法:
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
|
>>>
print
(name)
[
'aa'
,
'bb'
,
'cc'
]
>>>
for
element
in
name:
print
(element)
aa
bb
cc
>>>
while
count<
len
(name):
print
(name[count])
count
=
count
+
1
aa
bb
cc
不同于shell。
for
循环不需要加do语句
>>>
for
element
in
name:
do
print
(element)
done
Traceback (most recent call last):
File
"
, line
2
,
in
do
NameError: name
'do'
is
not
defined
>>>
|