shell第三天(数组,变量声明,常见命令等)

变量声明和使用

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
>>>

你可能感兴趣的:(Shell)