天天看点

变量和数组

一 . 变量

1.局部变量:不用定义 使用时直接用就可以 在赋值的时候直接用=就可以 =两边不能有空格。只在当前shell环境生效。在调用变量时要在变量前加$符号。linux中默认大写字母都是变量。

如果变量出现在字符串开头或者中间,调用变量需要将变量用“{}”:

$dir=/usr/feng

echo ${dir}tao/test1

如果不加“{}”,shell会认为dirtao是一个变量,会无法找到test1文件

将执行的命令结果赋给变量有两种方式:

$dir=`pwd`

$dir={dir}

2.全局变量:

export 变量名1 变量名2 变量名3  ... ...

全局变量会被子shell继承,如果子shell中局部变量和全局变量重名,则优先使用局部变量。

3.特殊变量:

$0 存放脚本名字

$1 $2 $3 ... $9 $(10) $(11) ... 存放执行脚本参数,位置一一对应

shift:移动参数位置,默认从$1开始全部实参向左移动一个,shift 4 表示全部移动四个位置

$# 返回参数个数

$? 上一步执行结果:正确执行为0,错误为非0

$$ 当前进程的进程号

$! 上一个后台命令的对应的进程号

$* 所有实参的字符串

$@ 同上

$- 查看shell是否是交互式,有i就是

4.参数置换变量:  #可用于条件判断,要比if简练

变量2=${变量1:-字符串}

如果变量1的值为空,则变量2等于给定的字符串;否则,变量2等于变量1

变量2=${变量1:=字符串}

如果变量1的值为空,则变量2和变量1等于给定的字符串;否则,变量2等于变量1

变量2=${变量1:+字符串}

如果变量1的值为空,则变量2和变量1都为空;否则,变量2等于给定的字符串,变量1不变

变量2=${变量1:?字符串}

如果变量1的值为空,则会以“ 脚本名 : 变量1 : 字符串 ”的格式显示,并从当前shell退出,变量2保持原值;否则,变量2等于变量1的值,变量1不变。

变量和数组

二 . 数组

shell中的数组只是一维数组,下标同样是从0开始。数组也同变量一样可以不用声明,直接赋值:

name[3]=feng

echo ${name[3]}

对数组多个值赋值,每个值之间用空格隔开:

name=(this is a test)

如果输出下标为空,则输出数组中下标为0的元素,如果下标为*或@,则输出所有,我理解是有点类似正则的意思。如果输出的下标超出了数组的范围,则认为他是一个新的未赋值的元素,输出为空。

定义数组:declare -a 数组名

取消定义:unset name[3] 取消定义name[3] ;unset name, unset name[*]和unset name[@]是取消定义整个数组

${name[*]}和${name[@]}用“”引起来的时候是有区别的:

“${name[*]}”数组中的内容被扩展成一个字符串

“${name[@]}”数组中的内容可以被扩展成多个字符串,如果没有字符则扩展成空串。

下面是例子:

变量和数组

去掉引号后结果一样:

变量和数组

3.交互

read:从键盘上读取数据

read name 读取一个变量

read a b c 读取3个

read -t 3 变量  等待3秒

read -s 变量 输入不显示在屏幕上

read -n 3 变量  只能输入3个字符到变量中

read -d ":" 变量 指定:为输入结束标志

键盘输入与变量位置对应赋值,以空格分隔,输入数小于变量个数,变量取空串,反之,依次对应,剩余的按照字符串赋值给最后一个变量

变量和数组

echo :将输出显示到显示器上

echo -e 选项有如下转义字符:

\a 响铃报警

\b 退一个字符位置

\e 转义字符

\f 换页

\n 换行

\r 回车

\t 水平制表符

\v 垂直制表符