为使用shell编程更加有效,系统提供了一些shell变量。shell变量可以保存注诸如路径名、文件名、或者数字这样的变量。从这一点上看,shell编程中,变量至关重要。
本地变量
- 本地变量在用户现有的shell生命期内有效。
定义本地变量:变量名=变量值的格式
MYVAR=”test
”注意=左右不要有空格
使用本地变量$MYVAR,,如:
echo $MYVAR or echo ${MYVAR}
- set命令显示本地所有的变量
每登录一个终端,都会运行一个shell程序,定义一个本地变量,这个本地变量,就保存在这个shell程序中;如果再新登录,将启动新的shell程序,与原来的shell不同,之前定义的本地变量只存活于定义时候的shell,与新的shell没关系。
只读变量
格式:readonly variablename
readonly的变量,不能被清除
环境变量
- 环境变量用于所有用户进程,具体一点是针对用户级别的配置,因用户不同而不同。
- 配置文件:
$HOME/.bash_profile
(/etc/profile
,所有用户都使用的profile) - export 声明环境变量 export myvar=”tttt”
- 查看环境变量
env
命令
变量替换(显示变量)
- 用变量的值替换它的名字
- 在变量名前加$,使用echo命令可以显示单个变量取值。
${parameter} 变量的内容会被展开
${parameter:-word} 当变量没有被设定,或是为空值的时候,word就会被展开。否则,变量被展开。--变量不存在,显示word
${parameter:=word} 当变量没有被设定,或是为空值的时候,word就会被展开,而且这个值会被代入到变量里面。若不是,则变量内容被展开。--变量不存在,显示word,且位变量赋值为word
${parameter:?word} 当变量没有被设定,或是为空值的时候,会将word显示在标准错误输出,并结束。若不是的话,则变量的内容会被展开。--变量不存在,显示word,并结束。
${parameter:+word} 当变量没有被设定,或是为空值的时候,则不会展开任何东西。否则会展开word的内容。--变量存在显示word
清除变量
- unset命令清除变量
unset testvar
- readonly的变量,不能被清除
位置变量
- 形如:
$0 $1 $2 $3 …$9
,其中$0
代表bash文件名称 其他就是命令行参数 - 示例代码
#!/bin/bash
#param
echo "脚本的名字 $0"
echo "parm 1: $1"
echo "parm 2: $2"
echo "parm 3: $3"
echo "parm 4: $4"
echo "parm 5: $5"
- 向脚本中使用位置参数
#!/bin/bash
#param.sh
find /usr/lib/ -name $1 –print
#查找目录下文件名是第一个参数的文件
标准变量
- bash默认建立了一些标准环境变量,可在
/etc/profile
中定义 - EXINIT 定义一些vim的初始化参数
- HOME echo $HOME–用户家目录
- FS 在linux系统中字符之间的间隔
测试echo $IFS
- LOGNAME
测试echo $LOGNAME
- MAIL–当前登录用户,其邮箱在什么地方存储
测试echo $MAIL
- TERM 登录服务器,终端类型vt100
PATH标准变量
- 可以使用set |grep “PATH”来查看path配置路径
- 当我们在shell运行一个程序时,shell会从path路径中查找程序。
TZ 时区
- PS1 提示符
- echo $PS1
- PS1=’[\u@\h \w] $’ u代表用户名 h主机名 w代表当前目录
- 可以自己更改PS1
- 通过
sudo grep -r "PS1" /etc/
命令可以查看在哪一个文件修改PS1
PS2 –
“> ”
大尖括号+空格。- 在一行上面运行多个命令
- 一条命令没有写完,自动换行后,shell提示符
- 和c语言宏定义一样使用’\’作为续行符
PWD–当前路径
- SHELL 我当前运行的shell时那个shell解析器
- 其他:
MAILCHECK、MAILPATH、MANPATH、TERMINFO
特殊变量
- $# 传递到脚本的参数个数
- $* 以一个字符串形式显示所有向脚本传递的参数,与位置变量不同,该选项参数可以超过9个。
$*为"1 2 3"
(一起被引号包住) - $$ 脚本运行的当前进程ID号
- $! 后台运行的最后一个进程的进程ID
- @与*相同,但是使用时加引号,
$@为"1" "2" "3"
(分别被包住)–所以需要使用引号括起来,否则展开以后容易解释错误,因为他只解释第一个参数。 - $- 显示shell使用的当前选项,与set命令功能相同
- $? 显示前一条命令的退出状态。0表示没有错误,其他任何值表明有错误
#!/bin/bash
#param
echo "脚本的名字 $0"
echo "parm 1: $1"
echo "parm 2: $2"
echo "parm 3: $3"
echo "parm 4: $4"
echo "parm 5: $5"
echo "显示参数的个数:$#"
echo "显示脚本全部参数:$*"
echo "显示前一命令运行后状态:$?"
影响变量的命令
declare 设置或显示变量
- -f 只显示函数名
- -r 创建只读变量(declare和typeset)
- -x 创建转出变量
- -I 创建整数变量
- -使用+代替-,可以颠倒选项的含义(只读变量除外)
export 用户创建传给shell的变量,即:创建环境变量
- – 表明选项结束,所有后续参数都是实参
- -f 表明在“名-值”对中的名字是函数名。
- -n 把全局变量转换成局部变量。换句话说,命令的变量不在传给shell
- -p 显示全局变量列表
- readonly 用于显示或者设置只读变量
- – 表明选项结束
- -f 创建只读变量
- set 使用set命令显示所有本地定义的shell变量。
- 设置或者重设各种shell
- set -a
- env 查看所有环境变量。
- shift [n] 用于移动位置变量,调整位置变量,
是$3的值赋予$2,$2的值赋予$1
- typeset 用于显示或设置变量
- 是declare的同义词
- unset 用于取消变量的定义
- – 表明选项结束
- -f 删除只读变量,但不能删除从shell环境中指定的全局变量和函数。如:
PATH,PS1,PS2,PPID,UID,EUID
等的设置。
- 示例代码
#!/bin/bash
#param
echo "脚本的名字 $0"
echo "parm 1: $1"
echo "parm 2: $2"
echo "parm 3: $3"
echo "parm 4: $4"
echo "parm 5: $5"
echo "开始shift 2"
shift 2
echo "parm 1: $1"
echo "parm 2: $2"