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="
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
之类的经常会见到。