是1种弱类型的变量,声明时不需要指定其变量类型,也不需要遵守“先声明后使用”,任什么时候候只要想用就能够用。
局部变量
在某个shell中生效的变量,在其他shell中无效。可使用local内建命令来“显示”的声明局部变量
环境变量
shell脚本中,默许是全局的
预设的环境变量:
BASH:说明bash的全路径
BASH_VERSION
CDPATH:用于快速进入目录
EUID:记录当前用户的UID
FUNCNAME :在用户函数体内部,记录当前函数体的函数名
HISTCMD:记录下1条命令在history命令中的编号
HISTFILE:记录history命令的记录文件的位置
HISTFILESIZE
HOSTNAME
HOSTTYPE:主机架构
MACHTYPE:主机类型的GNU标示
LANG:语言环境
PWD:记录当前目录
OLDPWD:记录之前目录
PATH
PS1:
命令提示符,默许是[u@h W]$,其中u是用户名,h是主机名,W是当前工作目录的basename,$是用户UID的替换字符。
定义和使用变量
var=value
注意:
1、=两边没有空格 var = value(X)
2、变量中有空格时必须要用””或’’引发来
取值:${var}或$var
注意:
1、如果变量值援用的是其他变量,则必须使用双引号。由于单引号会禁止shell解释特殊字符$。
2、由于shell是弱变量特性,因此即便在脚本中没有定义变量也是可以援用的,从而使得毛病很难找到。
3、shell具有弱变量的特性,不需要声明就能够使用,可以设置变量必须先声明再使用
shopt -s -o nounset
取消变量
unset var
取消函数
unset function
特殊变量
位置参数
$1,...,$n 当n>10时,需要写成$(n)
$0
$@/$* 脚本所有的参数
$# 脚本参数总和
脚本或命令返回值
$? 上1个命令的返回值,要查看某个命令的返回值必须在运行中个命令后立即查看$?
linux中规定正常的退出命令和脚本应当以0作为其返回值,任何非0的返回值都表示命令未正确退出或正常履行
在自动化脚本中,也能够通过$?变量的值判断之前命令的履行状态,从而采取不同的动作
数组
shell变量是弱类型的,其实不要数组的每个元素都是相同的类型,shell中的数组对元素个数没有限制,但是只支持1维数组
shell对数组变量的声明非常宽松,随时都可以根据需要增加变量中的元素
定义
declare -a array
初始化
array[0]=0
array[1]=1
array[2]="hello"
或
declare -a array=(0 1 "hello")
array[3]='waNG'
或
array=('john' 'sue')
或
array=([3]=3 [4]=4 [7]=4)
跳号赋值
数组操作
取值
${arrayname[index]}
例:
1、echo ${array[0]} //取单个元素
2、echo ${array[@]} //取所有的元素值,得到的是以空格隔开的元素值
3、echo ${array[*]} //取所有的元素值,得到是1全部字符串
4、arr1=arr2 //这样相当于arr1=arr2[0]
长度
利用@或*可以将数组扩大成列表,然后使用#来获得数组元素的个数
例:
1、echo ${#array[@]}
2、echo ${#array[*]}
通过本例也就知道了求字符串的长度,${#string}
截取
截取某个元素的1部份,对象可以是全部数组或某个元素
例:
1、取出数组的第1,第2个元素
echo ${array[@]:1:2}
2、取出第2个元素从第0个开始连续5个字符
echo ${array[2]:0:5}
连接
conn=(${arr1} ${arr2})
替换数组元素
array=(${array[@]/old/new})
取消数组或元素
unset array[0]
unset array
只读变量
readonly RO=100
等效于:declare -r RO=100
变量的作用域
1、shell变量的作用域是在本shell内,属于本shell的全局变量,也就是从定义该变量的地方开始到shell结束,或主动使用unset删除该变量的地方为止。
2、在函数题内使用local关键字声明了和全局变量同名的局部变量后,对该变量的操作只会影响局部变量,而不会影响与之同名的全局变量。
上一篇 BZOJ 4012 HNOI2015 开店 动态树分治+二分
下一篇 贪心算法原理