变量
变量赋值
- 直接赋值:
var="abc"
- 通过命令返回:
var=`date`
或var=$(date)
- 通过交互读入:
read var
- 取消变量赋值:
var=
- 取消变量:
unset var
环境变量(一般推荐用大写)
export var="abc"
或export var
- 取消环境变量:
unset var
变量调用
一般地,采用$var
即可.在字符串中或其余语句中,为了避免误解,更常用${var}
方法调用,{}
是最规范方法.
另外,变量可以在大括号内加入修饰词来对变量进行进一步操作.如下:
${#var} #返回变量字符串的长度
${变量1/查找字符/替换字符} #将从左起找到的字符替换为替换字符串(字符串不用"")
${变量1/#查找字符/替换字符} #将左边第一个字符起的查找字符替换为替换字符串
${变量1/%查找字符/替换字符} #右边第一个字符起的查找字符替换为替换字符串
${变量1//查找字符/替换字符} #将所有查找到的字符替换为替换字符串
${变量1:位置} #返回从位置起到结尾的字符串,注意位置是从0数起的,(-3)是倒数第三个
${变量1:开始位置:结束位置} #某个范围内.不能为负数.
${字串#匹配字串};${字串%匹配字串} #最左/最右起匹配的最短字符串(支持*等)的删去
${字串##匹配字串};${字串%%匹配字串} #最左/最右起匹配的最长字符串(支持*等)的删去
例子:
${1%.*} #变量文件名(不包含.txt)
${1%/*} #变量文件所在目录
${1##*.} #变量文件的后缀名
${@:3} #第三个及以后的所有输入参数
注意:csh/zsh才有用法:对于路径的文件名, :t
表示file.txt(文件名), :r
=/abc/file(除去扩展名部分), :e
=txt(扩展名), :h
=/abc(目录名) 如${var:e}获得后缀名.
数组
赋值和取消赋值
- 直接赋值:
array=(a b c)
- 字符串转化:
x="a b c d";array=(x)
- 逐个指明:
array=([0]=var1 [1]=var2 [2]=var3 ... [n]=varN)
- 使用seq:
array=(`seq 1 2 10`)
- 声明是个数组:
declare -a array
,一般不使用. - 对指定元素赋值:
array[n]="a"
(元素序号见下说明). - 数组末追加元素:
varname=(${var[*]} varn-1 varn varn+1)
或varname[${#var[*]}]=varn
.前者更好,避免zsh时索引号不对. - 删除某个元素:
unset var[n]
,bash用,csh不行 - 清空某个元素:
var[n]=
,注意该元素还在,没有值,数组长不变!不适用于csh - 整个数组删除:
unset var
调用
- 调用元素:
${array[n]}
.注意,bash,ksh使用0开始;zsh.tcsh使用1开始,还直接支持$array[n]
的用法. - 调用所有元素:
${array[*]}
或${array[@]}
.bash$array
只会返回第一个元素.在zsh,tcsh支持$array
返回所有元素. - 返回数组元素数目:
${#array[*]}
,zsh/tcsh支持${#array}
- 查看数组现在的情况:
set|grep arrayname
运算
((z=x+y))
或let z=x*y
,前者可以加入空格进行分割,后者let只能连着输入不能有空格.只支持整数运算.在csh使用@ z=$a + $b
的方法.- 支持
+-*/%,**
运算,/
会取整.%
取余,**
幂运算 - 支持
+=,-=,*=./=,%=
自操作运算. - 支持
z++,z--
自加/减一运算. expr 5 + 7
直接运算并返回.只支持+-*/%
,其中乘要转义\*
.运算符号左右都有空格.expr的优点是可以跨不同shell使用.- 类似于expr效果,
$((5+7))
和$[5+7]
也能输出运算结果,运算符号左右可以没有空格.