变量的定义、引用、删除
1 2 3 4 5 6 7 8 9 10 |
[root@lb01 ~]# name='clf' #定义变量name [root@lb01 ~]# echo $name #调用变量name clf [root@lb01 ~]# percent=33 [root@lb01 ~]# echo ${percent}% 33% [root@lb01 ~]# unset name #取消变量 [root@lb01 ~]# unset percent #取消变量 |
变量值的三种来源
1)直接赋值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
[root@lb01 ~]# A=1234567 [root@lb01 ~]# echo $A 1234567 [root@lb01 ~]# echo ${A:2:4} 表示从A变量中第3个字符开始截取,截取4个字符 3456 说明: $变量名 和 ${变量名}的异同 相同点:都可以调用变量 不同点:${变量名}可以只截取变量的一部分,而$变量名不可以 ------------ #### 2)命令执行结果赋值给变量 ------------ ```bash [root@lb01 ~]# B=<code>date +%F [root@lb01 ~]# echo $B 2019-04-16 |
3)传递参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
从调用脚本时传入的位置参数获取变量值:./b.sh a1 a2 a3 需要用到$n获取第n个位置参数值,超过10需要用${n},如下 $0 $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} # 示例 [root@lb01 ~]# cat b.sh #!/usr/bin/env bash echo ${0} echo $1 echo $2 echo $3 echo $4 echo $5 echo $6 echo $7 echo $8 echo $9 echo ${10} # 运行 [root@egon ~]# chmod +x b.sh [root@egon ~]# ./b.sh a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 ./b.sh a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 |
4)read从键盘输入读取
常见选项:
选项 | 解释 |
---|---|
-p | 定义提示用户的信息 |
-n | 定义字符数(限制变量值的长度) |
-s | 不显示(不显示用户输入的内容) |
-t | 定义超时时间,默认单位为秒(限制用户输入变量值的超时时间) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#用法1:用户自己定义变量值 [root@lb01 ~]# read -p "Input your name:" name Input your name:tom [root@lb01 ~]# echo $name tom #用法2:变量值来自文件 [root@lb01 ~]# cat 1.txt 10.1.1.1 255.255.255.0 [root@lb01 ~]# read ip mask < 1.txt [root@lb01 ~]# echo $ip 10.1.1.1 [root@lb01 ~]# echo $mask 255.255.255.0 |
定义有类型的变量(declare)
选项:
选项 | 解释 | 举例 |
---|---|---|
-i | 将变量看成整数 | declare -i A=123 |
-r | 定义只读变量 | declare -r B=hello |
-a | 定义普通数组;查看普通数组 | |
-A | 定义关联数组;查看关联数组 | |
-x | 将变量通过环境导出 | declare -x AAA=123456 等于 export AAA=123456 |
举例说明:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[root@lb01 ~]# declare -i A=123 [root@lb01 ~]# echo $A 123 [root@lb01 ~]# A=hello [root@lb01 ~]# echo $A 0 [root@lb01 ~]# declare -r B=hello [root@lb01 ~]# echo $B hello [root@lb01 ~]# B=world -bash: B: readonly variable [root@lb01 ~]# unset B -bash: unset: B: cannot unset: readonly variable |
变量的分类
1) 本地变量
1 |
当前用户自定义的变量。当前进程中有效,其他进程及当前进程的子进程无效。 |
2) 环境变量
环境变量:当前进程有效,并且能够被子进程调用。
- env查看当前用户的环境变量
- set查询当前用户的所有变量(临时变量与环境变量)
- export 变量名=变量值 或者 变量名=变量值;export 变量名
1234[root@lb01 ~]# export A=hello 临时将一个本地变量(临时变量)变成环境变量[root@lb01 ~]# env|grep ^AA=hello
永久生效:
vim /etc/profile 或者 ~/.bashrc
export A=hello
或者
A=hello
export A
说明:系统中有一个变量PATH,环境变量
export PATH=/usr/local/mysql/bin:$PATH
3) 全局变量
1 2 |
● 全局变量:全局所有的用户和程序都能调用,且继承,新建的用户也默认能调用. ● 解读相关配置文件 |
文件名 | 说明 | 备注 |
---|---|---|
$HOME/.bashrc | 当前用户的bash信息,用户登录时读取 | 定义别名、umask、函数等 |
$HOME/.bash_profile | 当前用户的环境变量,用户登录时读取 | |
$HOME/.bash_logout | 当前用户退出当前shell时最后读取 | 定义用户退出时执行的程序等 |
/etc/bashrc | 全局的bash信息,所有用户都生效 | |
/etc/profile | 全局环境变量信息 | 系统和所有用户都生效 |
$HOME/.bash_history | 用户的历史命令 | history -w 保存历史记录 history -c 清空历史记录 |
1 2 3 4 5 6 |
● 用户登录系统读取相关文件的顺序 /etc/profile $HOME/.bash_profile $HOME/.bashrc /etc/bashrc $HOME/.bash_logout |
系统变量
内置变量 | 含义 |
---|---|
$? | 上一条命令执行后返回的状态;状态值为0表示执行正常,非0表示执行异常或错误 |
$0 | 当前执行的程序或脚本名 |
$# | 脚本后面接的参数的个数 |
$* | 脚本后面所有参数,参数当成一个整体输出,每一个变量参数之间以空格隔开 |
$@ | 脚本后面所有参数,参数是独立的,也是全部输出 |
$1~$9 | 脚本后面的位置参数,$1表示第1个位置参数,依次类推 |
${10}~${n} | 扩展位置参数,第10个位置变量必须用{}大括号括起来(2位数字以上扩起来) |
$$ | 当前所在进程的进程号,如echo $$ |
$! | 后台运行的最后一个进程号 (当前终端) |
!$ | 调用最后一条命令历史中的参数 |
数组分类
1 2 |
● 普通数组:只能使用整数作为数组索引(元素的下标) ● 关联数组:可以使用字符串作为数组索引(元素的下标) |
普通数组定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#一次赋予一个值 数组名[索引下标]=值 array[0]=v1 array[1]=v2 array[2]=v3 array[3]=v4 #一次赋予多个值 数组名=(值1 值2 值3 ...) array=(var1 var2 var3 var4) array1=(`cat /etc/passwd`) 将文件中每一行赋值给array1数组 array2=(`ls /root`) array3=(harry amy jack "Miss Hou") array4=(1 2 3 4 "hello world" [10]=linux) |
数组的读取
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
${数组名[元素下标]} echo ${array[0]} #获取数组里第一个元素 echo ${array[*]} #获取数组里的所有元素 echo ${#array[*]} #获取数组里所有元素个数 echo ${!array[@]} #获取数组元素的索引下标 echo ${array[@]:1:2} #访问指定的元素;1代表从下标为1的元素开始获取;2代表获取后面几个元素(索引默认从0开始) 查看普通数组信息: [root@lb01 ~]# declare -a [root@lb01 ~]# msg="hello world" [root@lb01 ~]# echo ${msg:2:6} #从第二个元素开始,截取后面的6个元素 llo wo |
关联数组定义
数组赋值
1 |
[root@lb01 ~]# declare -A B=(["name"]=clf ["age"]=18 ["gender"]=man) |
获取关联数组值
1 2 3 4 5 6 7 8 9 10 11 12 |
[root@lb01 ~]# echo ${B[age]} 18 [root@lb01 ~]# echo ${B[*]} #输出所有元素 man clf 18 [root@lb01 ~]# echo ${!B[*]} #输出所有索引 gender name age B [root@lb01 ~]# echo ${#B[*]} #统计元素个数 3 |
其他变量定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
一个“%”代表从右往左删除 两个“%%”代表从右往左去掉最多 一个“#”代表从左往右去掉删除 两个“##”代表从左往右去掉最多 举例说明: # url=www.sina.com.cn # echo ${#url} 获取变量的长度 # echo ${url#*.} # echo ${url##*.} # echo ${url%.*} # echo ${url%%.*} #放在左边表示获取变量长度 [root@lb01 ~]# url="www.sina.com.cn" [root@lb01 ~]# echo ${#url} 15 #放在右边#表示从左往右删除 [root@lb01 ~]# echo ${url#*.} sina.com.cn #放在右边两个##表示左往右贪婪删除 [root@lb01 ~]# echo ${url##*.} cn #放在右边%表示从右往左删除 [root@lb01 ~]# echo ${url%.*} www.sina.com #放在右边两个%%表示右往左贪婪删除 [root@lb01 ~]# echo ${url%%.*} www #替换 // 和 / #一个/表示从左往右替换1个 [root@lb01 ~]# echo ${url/c/C} www.sina.Com.cn #两个//表示替换所有 [root@lb01 ~]# echo ${url//c/C} www.sina.Com.Cn |
变量的替代
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
# ${x:-临时变量信息} 没有定义过变量x,则使用-后的值 [root@lb01 ~]# unset x [root@lb01 ~]# echo ${x:-no} no [root@lb01 ~]# x= [root@lb01 ~]# echo ${x:-no} no # ${x:=新的变量信息} 当调取变量信息值为空时或未定义,则设置指定字符串为新的变量值 [root@lb01 ~]# unset x [root@lb01 ~]# echo ${x:=ppp} ppp [root@lb01 ~]# echo $x ppp # ${x:?没有设置变量提示信息} 当调取变量信息值为空时或未定义,指定为赋值的错误提示信息 [root@lb01 ~]# unset x [root@lb01 ~]# echo ${x:?该变量没有定义过} -bash: x: 该变量没有定义过 # ${x:+有设置变量提示信息} 当调取变量信息值为空时或未定义,不做任何处理,否则word字符串将替代变量值 [root@lb01 ~]# unset x [root@lb01 ~]# echo ${x:+11111} [root@lb01 ~]# echo $x [root@lb01 ~]# x=222 [root@lb01 ~]# echo ${x:+11111} 11111 [root@lb01 ~]# echo $x 222 |