一 . 变量
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 垂直制表符
转载于:https://blog.51cto.com/fengtao/1323017