shell变量
1、变量定义
1.1 变量有什么用
但我们需要使用到重复性的东西;或者说一些当前环境的一些特有的东西,比如IP地址;或者一些需要灵活修改的地方,比如版本号;这时候我们就需要定义变量,可以更加便捷的进行维护和修改,节省时间
1.2 定义变量
格式: 变量名=变量值
(定义变量时=之间不能使用空格)
比如:
name=nginx ##字符串
version=18 ##整形
num=8.8 ##浮点数
1.3 取消变量
格式: unset 变量名
比如:
unset name
unset version
unset num
1.4 有类型变量
## declare -i 变量变成整数
[root@controller shell]# declare -i num=test
[root@controller shell]# echo $num
0
## declare -r 变量变成只读
[root@controller shell]# declare -r num
[root@controller shell]# num=10
-bash: num: readonly variable
## declare -x 导出环境变量
[root@controller shell]# declare -x
declare -x HISTCONTROL="ignoredups"
declare -x HISTSIZE="1000"
declare -x HOME="/root"
declare -x HOSTNAME="controller"
declare -x LANG="en_US.UTF-8"
declare -x LESSOPEN="||/usr/bin/lesspipe.sh %s"
declare -x LOGNAME="root"
2、变量分类
根据变量的作用域和生命周期分为四类:本地变量、环境变量、全局变量、内置变量
2.1 本地变量
自己定义的变量,定义在终端或者脚本里,脚本或者终端结束即失效;如果是脚本定义的变量只能脚本内部调用,定义在终端的只能在终端使用。
[root@controller ~]# test=10
[root@controller ~]# echo $test
10
[root@controller ~]# cat test.sh
#!/bin/bash
age=18
echo $age
[root@controller ~]# bash test.sh
18
2.2 环境变量
定义在root下的.bashrc或者.bash_profile 文件中,只能本地用户使用,脚本无法调用,用env查看当前用户的环境变量
[root@controller ~]# vi .bashrc
# .bashrc
# User specific aliases and functions
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
version=18 ##定义一个本地变量
export test=20 ## 定义一个全局变量
fi
需要重新登入会话
[root@controller ~]# echo $version
18
[root@controller ~]# bash test.sh
20
2.3 全局变量
export命令将本地变量输出为当前shell的环境变量,脚本和当前shell都可以调用到变量,克隆会话变量将会失效;在/etc/profile和/etc/bashrc永久定义变量,所有用户及shell都可以调用到。
输出全局变量printenv
[root@controller ~]# export test=20
[root@controller ~]# echo export age=18 >> /etc/profile
[root@controller ~]# source /etc/profile
[root@controller ~]# bash test.sh
18
20
2.4 内置变量
系统变量,shell已经定义好名字和作用的变量
$? 执行上条命令后返回的状态
0:运行成功
127: 命令不存在
126:权限不够
182: 没有文件或目录
$$:当前进程号
$!:后台运行的最后的一个进程号
!$:调用最后一条命令的参数
!!:调用历史最后一条命令
#!/bin/bash
echo "\$0 = $0" ## 当前进程号
echo "\$# = $#" ## 脚本后面参数的个数
echo "\$* = $*" ## 后面参数当作一个整体输出
echo "\$@ = $@" ## 输出后面所有参数
echo "\$1 = $1" ## 第一个参数
echo "\$2 = $2" ## 第二个参数
echo "\$3 = $3" ## 第三个参数
echo "\$11 = ${11}" ## 第十个以后参数要加{}
echo "\$12 = ${12}" ## 第十二个参数
[root@controller shell]# bash 1.sh 1 2 3 4 5 6 7 8 9 10 11 12 13
$0 = 1.sh
$# = 13
$* = 1 2 3 4 5 6 7 8 9 10 11 12 13
$@ = 1 2 3 4 5 6 7 8 9 10 11 12 13
$1 = 1
$2 = 2
$3 = 3
$11 = 11
$12 = 12
2.5 总结
变量类型 | 作用域 | 生命周期 |
---|---|---|
本地变量 | 当前shell环境(子shell不能使用) | 脚本或者终端结束 |
环境变量 | 当前shell环境或者子shell | 当前进程结束 |
全局变量 | 所以用户和shell | 关机 |
内置变量 | 所以用户和shell | 关机 |
3、其他变量
3.1 取出目录和文件:
[root@controller ~]# A=/root/shell/
[root@controller ~]# echo $A
/root/shell/
[root@controller ~]# dirname $A
/root
[root@controller ~]# basename $A
shell
3.2 变量内容删除或替换
一个%代表从右往左删除一个key,两个代表去掉最大一个key
一个#代表从左往右删除一个key,两个代表去掉最大一个key
[root@controller ~]# url=www.baidu.com
[root@controller ~]# echo ${#url}
13
[root@controller ~]# echo ${url%.*}
www.baidu
[root@controller ~]# echo ${url%%.*}
www
[root@controller ~]# echo ${url#*.*}
baidu.com
[root@controller ~]# echo ${url##*.*}