shell变量
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell变量相关的知识,希望对你有一定的参考价值。
定义:变量是用来存储非固定值的载体,它具有一个值,以及零个或多个属性
语法:name=[value] //如果value没有指定,变量将被赋值为空字符串
变量的分类
1. 环境变量
环境变量又称全局变量,环境变量是全局的,它适用于所有当前shell以及其派生出来的任意子进程,有些变量是用户创建的,其他的则是专用的shell变量。环境变量的配置文件是/etc/profile。我们可以使用env命令来查看环境变量:
[[email protected] ~]# env
HOSTNAME=root
SELINUX_ROLE_REQUESTED=
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=192.168.230.1 56923 22
SELINUX_USE_CURRENT_RANGE=
SSH_TTY=/dev/pts/0
USER=root
.....
也可以用set命令来查看环境变量:
[[email protected] ~]# set //set比env显示的信息更全,包括用户自定义的变量
BASH=/bin/bash
BASH_VERSION=‘4.1.2(1)-release‘
COLORS=/etc/DIR_COLORS
COLUMNS=80
DIRSTACK=()
EUID=0
ID=0
IFS=$‘ \t\n‘
LANG=zh_CN.UTF-8
LESSOPEN=‘|/usr/bin/lesspipe.sh %s‘
LINES=24
LOGNAME=root
......
如何查看环境变量的值:
[[email protected] ~]# echo $HOSTNAME root [[email protected] ~]# echo $USER root
2. 局部变量
局部变量只适用于当前shell,子进程不会继承这样的变量
如何自定义局部变量:
[[email protected] ~]# a=1 //定义局部变量
[[email protected] ~]# echo $a //查看局部变量
1
[[email protected] ~]# unset a //删除局部变量
我们可以通过typeset把变量设置成只读,这样变量的值就不会被随意修改了:
[[email protected] ~]# a=1 //定义局部变量
[[email protected] ~]# typeset–r a //添加readonly只读属性
[[email protected] ~]# a=2 //再尝试修改变量的值是不可以的
bash:a:readonly variable
我们可以通过read命令来设置变量,read从标准输入中读取变量值,使用-p可以添加相应的提示信息:
[[email protected] ~]# read var //回车后输入要赋值给变量var的值
100
[[email protected] ~]# echo $var //查看var的值
100
[[email protected] ~]# read -p "Please input a number: " var
Please input a number: 99 //在提示符后面输入要赋值给变量var的值
[[email protected] ~]# echo $var
99
我们也可以把局部变量做相互运算:
[[email protected] ~]# a=1
[[email protected] ~]# b=2
[[email protected] ~]# c=$a+$b
[[email protected] ~]# echo $c //得出来的结果不是3而是1+2,并不是我们想要的
1+2
[[email protected] ~]# c=$[$a+$b] //应该这样写
[[email protected] ~]# echo $c
3
变量名规则:
- 变量名只能由英文、数字、下划线组成且不能以数字开头
- 变量名不要使用大写字母,避免与系统中的环境变量混淆
- 变量名不要使用系统的命令,如ls、which、cd等
- 变量名不要使用关键字,如if、for、do、done等
- 变量内容有特殊字符时要用单引号引起来,如空格、#、*等
- 变量内容含有变量时要用双引号引起来
[[email protected] ~]# a_2=0 //以字母开头
[[email protected] ~]# _a2=0 //以下划线开头
[[email protected] ~]# 2_a=0 //不能以数字开头
-bash: 2_a=0: command not found
3. 参数变量
注:这里的参数变量一般用在shell脚本中
#!/bin/bash echo $0 echo $1 echo $2 echo $3
执行结果:
[[email protected] ~]# sh test.sh a b c
test.sh //$0接收脚本名作为参数
a //$1接收第一个参数
b //$1接收第二个参数
c //$1接收第三个参数
变量相关的命令
1. bash命令
BASH是Shell的一种,bash命令可以进入一个全新的子shell环境,之前定义的变量都会失效,如果想要定义的变量有效,必须把变量声明为全局变量(命令为export)
[[email protected] ~]# a=123 //定义一个变量
[[email protected] ~]# bash //执行bash命令之后定义的变量失效
[[email protected] ~]# echo $a
[[email protected] ~]# export a=123 //通过export命令声明为全局变量
[[email protected] ~]# bash //执行bash命令之后定义的变量仍有效
[[email protected] ~]# echo $a
123
2. export命令
使用name=[value]的形式定义的变量默认仅在当前shell中有效,子进程不会继承这样的变量,使用export命令会将变量放入环境中,这样新的进程会从父进程那里继承环境,export可以直接定义环境变量并赋值,也可以先定义一个普通的用户变量,再通过export转换为环境变量。
[[email protected] ~]# a=1 //定义一个变量
[[email protected] ~]# bash //在当前shell下开启新进程bash
[[email protected] ~]# echo $a //查看变量值为空
[[email protected] ~]# a=1 //定义一个变量
[[email protected] ~]# export a //用export将变量添加至环境
[[email protected] ~]# bash //在当前shell下开启新进程bash
[[email protected] ~]# echo $a //再查看变量值就不是空值了
1
[[email protected] ~]# export a=1 //也可以直接定义环境变量
[[email protected] ~]# bash
[[email protected] ~]# echo $a
1
如何自定义环境变量
方法1:控制台中
只是临时使用,因为换个shell,你的设置就无效了,这种方法只针对特定的shell
配置:$PATH="$PATH:/my_new_path"
方法2:修改/etc/profile文件
设置系统全局环境变量和启动程序,当用户登录Linux时,该文件被执行,并从/etc/profile.d目录的配置文件中搜集shell的设置。预设的系统全局变量包括PATH、USER、LOGNAME、MAIL、INPUTRC、HOSTNAME、HISTSIZE、umask等。该设置永久有效,所有用户的shell都有权使用这些环境变量,可能会给系统带来安全性问题。这里是针对所有的用户的,所有的shell(如果你的计算机仅仅作为开发使用时推荐使用这种方法)
配置:vim /etc/profile
export PATH="$PATH:/my_new_path"
配置完后执行source /etc/.bashrc使配置生效
方法3:修改~/.bash_profile文件
定义用户专有的环境变量和启动程序。当用户登录时,该文件仅仅执行一次。默认情况下,它设置了一些环境变量,执行用户的.bashrc文件。针对某一个特定的用户,把使用这些环境变量的权限控制到用户级别,这里是如果你需要给某个用户权限使用这些环境变量,你只需要修改其个人用户主目录下的.bashrc文件就可以了,这种方法更为安全
配置:vim ~/.bash_profile
export PATH="$PATH:/my_new_path"
配置完后执行source /root/.bashrc使配置生效
方法4:修改/etc/bashrc文件
为每一个运行bash shell的用户执行此文件。当bash shell被打开时,该文件被读取。默认情况下,这个文件主要预设umask以及PS1等。/etc/bashrc不需要重启生效,重新打开一个bash即可生效,/etc/bashrc对所有用户新打开的bash都生效
方法5:修改~/.bashrc文件
该文件包含专用于用户的shell的bash信息,当用户登录时以及每次打开新的shell时,该该文件被读取。可以将用户自定义的alias和变量写到这个文件中。~/.bashrc只对当前用户新打开的bash生效,~/.bashrc中设定的变量(局部)只能继承/etc/profile中的变量,他们是"父子"关系.
方法6:修改~/.bash_logout文件
当每次退出系统(退出bash shell)时,执行该文件
以上是关于shell变量的主要内容,如果未能解决你的问题,请参考以下文章