Shell脚本之变量

203 阅读4分钟

变量

变量的作用

用来存放系统和用户需要使用的特定参数(值)。

  • 变量名:使用固定的名称,由系统预设或用户定义。
  • 变量值:能够根据用户设置、系统环境的变化而变化。

变量的类型

变量赋值:   

变量名=变量值(name=value)

bash变量类型:

1.自定义变量: 由用户自己定义、修改和使用。

2.特殊变量:

  • 环境变量(全局变量):全局生效,在任何bash环境中都可以识别。

  • 只读变量:read only,只可以读取不可以更改。

  • 位置变量: 通过命令行给脚本传递参数 。n(n是正整数),{10} 要加花括号。

3.预定义变量:(用来保持脚本程序的执行信息)

  • $0 :当前脚本名称(如果是软链接,显示当前软链接文件名)。
  • $? :查看上一次命令的执行状态,返回0为正常,非0为错误。
  • $* :返回所有参数,当整体返回。
  • $@ :返回所有参数,当个体返回。
  • $# :获取当前shell命令行中参数的总个数。
  • $_ :在此之前执行的命令或脚本的最后一个参数。

变量的命名要求

  • 区分大小写

  • 不能使程序中的保留字和内置变量:如:if, for,hostname 命令 a=

  • 只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反

  • 不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH

  • 大驼峰 StudentFirstName

  • 小驼峰 studentFirstName

  • 下划线 student_name

变量的作用范围

默认情况下,新定义的变量只在当前的shell环境中有效,因此称为局部变量,当进入子程序或新的shell环境中,局部变量将无法再起作用。

可以通过内部命令export将指定的变量为全局变量,使用户定义的变量在所有shell环境中可以继续使用。

方法:

  1. 方法一,设置全局变量:

    • export name=value
    • 或 declare -x name=value
  2. 方法二,将局部变量转变为全局变量:export name

例:

[root@localhost opt]# km=123
[root@localhost opt]# echo $km 
123
[root@localhost opt]# bash
[root@localhost opt]# echo $km
为空
[root@localhost opt]# exit
exit
[root@localhost opt]# echo $km
123
[root@localhost opt]# export km
[root@localhost opt]# bash
[root@localhost opt]# echo $km
123

image.png

read(从键盘输入的内容变成变量)

格式:

read 变量名

常用选项;

标题
-p后面跟提示信息,即在输入前打印提示信息
-s安静模式,在输入字符时不在屏幕上显示,例如密码
-t后面跟秒数,定义输入字符的等待时间
-n后跟一个数字,定义输入文本的长度
-a后跟一个变量,该变量会被认为是个数组
[root@localhost ~]# read -p "你的年龄是:" age
你的年龄是:25
[root@localhost ~]# echo $age
25

四个符号的作用

 双引号" ":会把引号的内容当成整体来看待。强引用,识别变量,允许通过$符号引用其他变量值。
 ​
 单引号' ':会把引号的内容当成整体来看待。弱引用,禁止引用其他变量值,单引号内的内容都会被认为是普通字符。
 ​
 反撇号` `$() :调用命令执行后输出的结果。如果存在嵌套,不能使用反撇号。
 ​
 花括号{  } :定义变量范围。 echo ${color}${price}

环境变量

系统内置环境变量

  1. 由系统提前创建,用来设置用户的工作环境
  2. 可以使用env查看环境变量
[root@localhost ~]# env
XDG_SESSION_ID=13
HOSTNAME=localhost.localdomain
SELINUX_ROLE_REQUESTED=
SHELL=/bin/bash
TERM=xterm
HISTSIZE=1000
SSH_CLIENT=192.168.10.1 52922 22
SELINUX_USE_CURRENT_RANGE=
SSH_TTY=/dev/pts/1
USER=root

常用的环境变量:

名称作用
$PATH表示可执行文件的默认路径
$USER表示用户名称
$HOME表示用户的宿主目录
$LANG表示语言和字符集
$PWD表示当前所在工作目录
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@localhost ~]# echo $USER
root
[root@localhost ~]# echo $HOME
/root
[root@localhost ~]# echo $LANG
zh_CN.UTF-8
[root@localhost ~]# echo $PWD
/root

环境变量特性:

  • 可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量
  • 一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程
  • 一般只在系统配置文件中使用,在脚本中较少使用

环境变量的配置文件

自定义的环境变量只是临时生效,退出系统后就会失效。需要将自定义的环境变量放入配置文件中,才会永久生效。配置文件可以用来长期变更或设置环境变量。 全局配置文件:

  • /etc/profile,修改此文件会作用于所有用户。

用户独立的配置文件:

  • ~/.bash_profile,修改这个文件只作用于当前用户。
 [root@localhost ~]# echo $TMOUT              //查看TMOUT,没有该变量
 
 [root@localhost ~]# vim ~/.bash_profile     //编辑用户的配置文件,加入变量TMOUT
 ----------------------
 TMOUT=900       //超时900秒后自动注销   
 
 [root@localhost ~]# source ~/.bash_profile    //刷新文件,使立即生效
 [root@localhost ~]# echo $TMOUT               //查看变量TMOUT,显示为900
 900

只读变量

我们在定义shell变量时,默认定义的变量是可以被修改的,但有一种变量是不能修改的,就是只读变量。

只读变量只能被赋值一次。只读变量在取得初始值之后,只能进行读取操作,不能重新赋值或删除。

定义变量:

  • 第一步:name=value # 定义一个变量
  • 第二步:readonly name # 使用 readonly 来修饰该变量 ,表明只读
[root@localhost ~]# name=123   //定义一个变量
[root@localhost ~]# readonly name   //使用 readonly 修饰该变量 ,表明只读
[root@localhost ~]# echo $name    
123
[root@localhost ~]# name=abc    //无法重新赋值
bash: name: 只读变量
[root@localhost ~]# unset name      //无法使用unset删除
bash: unset: name: 无法反设定: 只读 variable

image.png

位置变量

位置变量也称为位置参数。

使用$n表示,n为数字序列号,且必须为整数。

如:$1$2、…、$9 、${10}${11}

两位数需要加花括号{},不然$10会被识别为:$1和0 。

 [root@localhost ~]# cat km.sh
 #!/bin/bash
 echo "$1"    #显示位置1的参数
 echo "$2"    #显示位置2的参数
 echo "$3"    #显示位置3的参数
 
 [root@localhost ~]# bash weizhi.sh aaa bbb ccc
 aaa      //对应$1
 bbb      //对应$2
 ccc      //对应$3

预定义变量

预定义变量是系统定义好的变量,用来保持脚本程序的执行信息。

可以直接使用这些变量,不能直接为这些变量赋值。

变量作用
$?表示前一条命令执行后的返回状态。返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常。
$*表示所有位置参数的内容。当整体返回。(将输入的参数作为一个单词)
$@表示所有位置参数的内容。当个体返回。可作为数组。(将参数内容分割成n份,每份作为独立个体)
$#表示命令行中位置参数的总个数。
$0表示当前脚本名称(如果是软链接,显示当前软链接文件名)。
$_表示在此之前执行的命令或脚本的最后一个参数。
$$获取当前进程的PID。

$* 和 $@的区别:

  • 不加双引号的话,$* 和 $@ 都代表脚本后面跟的所有参数。
  • 加上双引号的话,"$*"会把所有参数当作一个整体去看待(此时参数数量为1),"$@"会把脚本后面跟的每一个参数当作一个个体去看待。
[root@localhost ~]# ls /opt
rh
[root@localhost ~]# echo $?
0
[root@localhost ~]# ls /xxx
ls: 无法访问/xxx: 没有那个文件或目录
[root@localhost ~]# echo $?
2
[root@localhost ~]# ls /opt /xxx
ls: 无法访问/xxx: 没有那个文件或目录
/opt:
rh
[root@localhost ~]# echo $?
2

image.png

四个配置文件的作用

1、/etc/profile 文件

系统级的配置文件,开机时系统自动加载该文件中的配置。

系统每次启动都会自动执行/etc/profile 文件里的命令,这个文件是对全局有效的(所有的shell环境和用户)。

2、~/.bash_ profile 文件

不同用户登录系统时,会自动执行自己家目录中的~/ .bash_ profile 文件中的命令,之后自动执行~/ . bashrc。(因为~/ .bash_ profile文件中规定了,如果~/ . bashrc是个文件,则执行该文件)。

3、~/.bashrc 文件

当前用户每切换一个shell环境都会自动加载~/ . bashrc 文件中的配置 ,之后自动执行/etc/bashrc文件。(因为~/ . bashrc文件中规定了,如果/etc/bashrc是个文件,则执行该文件)。

4、/etc/bashrc 文件

/etc/bashrc针对所有用户,用户每切换一个shell环境都会自动执行。