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替换
? 号
测试如下:
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),一对括号表示是数组,元素用空格分割,如果是逗号或者其他分割,数组中只有一个元素
[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开始 下标是:*或者@ 得到整个数组内容
[nxuser@PSBJ-0-0-0 data]$ echo ${name[2]} 3
直接通过 数组名[下标] 就可以对其进行引用赋值,如果下标不存在,自动添加新一个数组元素
[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 数组[下标] 可以清除相应的元素,不带下标,清除整个数据
[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 就是一个新数据。
[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
记住,数组元素是以空格分割的
替换
[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
调用方法是:${数组名[@或*]/查找字符/替换字符} 该操作不会改变原先数组内容,如果需要修改,可以看上面例子,重新定义数据
[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循环如下:
for VARIABLE in 1 2 3 4 5 .. N do command1 command2 commandN done
for循环的三个表达式 语法如下: for (( EXP1; EXP2; EXP3 )) do command1 command2 command3 done while expression do command command ``` done
#!/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
#!/bin/bash declare -a name name[${#name[*]}]=aaa name[${#name[*]}]=bbb name[${#name[@]}]=ccc for element in ${name[*]} do echo $element done
直接利用${数组名称}, 输出的是第一个元素,如下所示:
但是在python中是所有元素。
[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相关实现方法:
>>> 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 "<pyshell#28>", line 2, in <module> do NameError: name 'do' is not defined >>>