Shell变量
定义
- 变量顾名思义就是可以变化的量
- 变量必须以字母或下划线开头,名称中间只能由数字,字母或者下划线组成
- 变量的名称最大不超过255个字符
- 变量名在有效范围内必须唯一
- 变量默认类型都是字符串
分类
- 字符串
- 整型
- 浮点数
- 日期型
用户自己定义的变量
- 这些变量的值是自己定义的
- 变量名不能为数字开头
- 等号左右两边不能有空格
定义变量
name=wanghaoyu
age=23
输出变量
echo name # wanghaoyu
需要注意的是变量类型默认定义的都是字符串。
x=1
y=2
z=3
$o=$x+$y+$z
echo $o # 1+2+3
在赋值时候引用变量
在赋值时候引用变量有两种方式
-
m="$x"2 -
m=${x}2
这两种方式都表示给变量
m赋值,值为x变量的值加上字符串2。
set命令查看当前已经设置的变量
set命令查询默认已经生效的所有变量,包括系统变量,也包括自定义变量。
set | grep name
unset
unset表示删除变量
unset a
环境变量
- 环境变量是全局变量,而自定义变量是局部变量
- 自定义变量仅会在当前
shell中生效,而环境变量可以在当前shell以及子shell中生效 - 这种变量主要保存的是和操作系统环境相关的数据
- 变量可以自己定义,但是对于系统生效的变量名和变量作用是固定的
子
shell可以共享环境变量,但是不同窗口不可以访问到另一个shell的环境变量,也是临时的,别的shell窗口无法访问。
自定义环境变量
- 使用
export命令定义环境变量
export 变量名=变量值
env
env和set的区别是,set可以查看所有变量而env只能查看设置的环境变量。
env | grep name
常见环境变量
| 变量名 | 含义 | 示例 |
|---|---|---|
| HOSTNAME | 主机名 | localhost |
| SHELL | 当前SHELL类型 | SHELL=/bin/bash |
| HISTSIZE | 历史命令条数 | HISTSIZE=1000 |
| SSH_CLIENT | 当前如果是ssh链接方式的话,会记录客户端ip(链接者的ip) | SSH_CLIENT=192.168.1.95 18011 22 |
| USER | 当前登陆用户 | USER=root |
PATH 系统搜索路径
echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
关于$PATH的作用之前在PATH环境变量中有提到过。
他的含义简单来说比如我们输入一个
ls命令,那么系统就会在$PATH中的目录下去匹配是否存在ls这个命令,从左往右:分隔的目录下去找对应的命令,找到进行执行。找不到就提示不存在这个命令。
当我们想把一个脚本可以通过全局命令去执行,可以通过下列方式:
其实我们安装
nodejs也是相同的道理。
- 给对应文件添加可执行权限。
文件添加可执行权限,文件开头表示运行文件的环境,比如
shell需要开头标明#! /bin/bash,node文件的话开头标注#! /usr/bin/node告诉系统这是一个node去文件。
- 我们可以将我们对应的可执行文件加入到环境变量中的任意一个目录中去,这个时候我们就可以通过命令直接使用了。(
bash下直接使用文件名调用命令就可以直接执行脚本)
在已有的环境变量$PATH的目录中添加命令脚本。
- 当然我们也可以在
$PATH中再添加一个额外的目录,将命令脚本放入这个新建的文件中。注意需要:分隔,这个时候也可以达到相同的作用。
通过重新定义环境变量
export $PATH="$PATH:[新目录路径]"。
语系环境变量
-
查询当前语系
-
在
linux中可以通过local来设置程序运行的不同语言环境,local支持由ANSI C提供。 -
local的命令规则为<语言>_<地区>.<字符串编码集>,如zh_CN.UTF-8,zh代表中文,CN代表大陆地区,UTF-8表示字符集。 -
LANG系统定义的主语系的变量
位置参数变量
- 这种变量主要是用来向脚本传递参数或者数据时,变量名不能自定义,变量作用是固定的。
| 位置参数变量 | 作用 |
|---|---|
$n | n为数字,n代表命令本身,$1-$9代表执行命令的参数第n个参数,10以上需要使用${n},比如${10} |
$* | 这个变量代表命令中的所有参数,$*把所有参数当成了一个整体 |
$@ | 这个变量也代表命令中的所有参数,不过$@把每一个参数进行了单独区分 |
$# | 代表命令行中所有参数的个数,相当于length |
$n来举例test.sh
#! /bin/bash
echo "$1+$2+$3"
sh test.sh 1 2 3
输出1+2+3
$@来举例for.sh
#! /bin/bash
for i in "$@"
do
echo "i=$i"
done
sh for.sh 1 2 3
i=1
i=2
i=3
$@的概念就类似js中的arguments,可以通过循环一个一个获得。
$*来举例for.sh
#! /bin/bash
for i in "$*"
do
echo "i=$i"
done
i=3 4 5
这里的打印就可以看出
$@和$*的区别,一个是单独处理每个参数,一个是将所有参数当作整体处理。
$#参数的个数
echo $#
sh hello.sh 1 2 3 4 5
5 # 参数长度为5
预定义变量
- 预定义变量是脚本中已经定义好的变量,变量不能自定义,变量作用也是固定的。
| 预定义变量 | 作用 |
|---|---|
$? | 最后一次执行的命令状态,0表示成功,2表示失败 |
$$ | 当前进程的进程号 |
当我们需要根据命令的返回来决定一个分支条件运行,那么
$?就很有用了。
read命令
read [选项] [变量名]
表示可以读取用户输入的值保存在变量名中保存起来。
| 选项 | 含义 |
|---|---|
-p | 提示信息,在等待read输入时,输出提示信息 |
-t | 秒数,read命令默认会一直等待用户输入使用-t参数可以指定等待时间 |
-n | 字符数,read命令只接受指定的字符数,就会执行。(规定字数) |
-s | 隐藏输入的数据,通常用于密码输入 |
#! /bin/bash
read -p '你的名字是' -t 5 name
echo -e '\n'
read -p '你的性别是:' -n 1 gender
echo -e '\n'
read -p '你的密码是' -s password
echo $name,$gender,$password
# 执行脚本会进行提示read信息,按照输入信息完成后会`echo`出来。
read命令比如在登陆mysql之类的经常会见到。