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变量的主要内容,如果未能解决你的问题,请参考以下文章

Shell编程入门

代码片段:Shell脚本实现重复执行和多进程

玩转Bash变量

玩转Bash变量

2.5.2 变量

如何创建片段以重复变量编号中的代码行