env&&export
这两个命令均是列出当前系统中的所有的环境变量。
set
显示系统中的所有变量。包括 环境变量,用户自定义变量,以及与你自己使用的shell相关接口的变量。
几个重要的变量
- LANG
使用者的语系。 - RANDOM
产生随机数的变量,介于0~32767之间 - PS1(shell接口变量)
这个变量来指示你登陆的shell的提示前缀 - $
这也是一个特殊的变量,代表目前使用shell的pid
lyt@n55sl:~$ echo $$
8191
- ?
上一次执行指令所传回的值,通常来说,指令成功执行,会传回 0 ,否则会是其他数字,具体数字与指令本身有关
lyt@n55sl:~$ pwd
/home/lyt
lyt@n55sl:~$ echo $?
0
lyt@n55sl:~$ opopo
opopo:未找到命令
lyt@n55sl:~$ echo $?
127
export:自定义变量转环境变量
- 自定义变量与环境变量的区别
子程序会继承环境变量,自定义变量则不会继承 - 用法
export 变量名 - 对于环境变量的操作,子程序仅能继承父程序,不能将修改回传给父。
看下面的例子
┌─╼[~]
└────╼ export a=lyt
┌─╼[~]
└────╼ bash
lyt@n55sl:~$ echo $a
lyt
lyt@n55sl:~$ a=zxw
lyt@n55sl:~$ echo $a
zxw
lyt@n55sl:~$ exit
exit
┌─╼[~]
└────╼ echo $a
lyt
- 环境变量为何可被子程序引用?
当启动一个shell,操作系统会分配一个记忆区块给shell使用,这个内存的内存变量可以让子程序取用。
父程序使用export功能,可以使自定义环境变量的内容写入上述记忆区块当中。
当加载另一个shell时,子shell可以将父shell的环境变量所在的记忆区块导入自己的环境变量区块当中。
变量键盘读取,数组,宣告
- read
用来读取来自键盘输入的变量
参数
-p 后接用单或双引号括起来的提示信息;
-t 后接等待用户输入的时间;
lyt@n55sl:~$ read -p "is this $SHELL ?" a
is this /bin/zsh ?
- declare / typeset
宣告变量的类型
参数
-a 数组
-i 整形
-x 环境变量
-r 只读,不能更改,不可unset
lyt@n55sl:~$ i=10+20
lyt@n55sl:~$ echo $i
10+20
lyt@n55sl:~$ declare -i i=10+20
lyt@n55sl:~$ echo $i
30
r参数来添加或取消环境变量属性,-r添加为环境变量,+r取消为用户自定 变量
┌─╼[~]
└────╼ declare -x sss=10
┌─╼[~]
└────╼ env | grep sss
sss=10
┌─╼[~]
└────╼ declare +x sss=10
┌─╼[~]
└────╼ env | grep sss
┌─╼[~]
└╼
- 数组变量类型
声明 数组名[下标]=值
lyt@n55sl:~$ a[1]=20
lyt@n55sl:~$ a[0]=200
echo $a
200
lyt@n55sl:~$ echo ${a[0]} $a[1]
200 200[1]
lyt@n55sl:~$ echo ${a[0]} ${a[1]}
200 20
由此可见,数组名的默认值是数组的第一个元素,要想正确的输出数组元素,必须用${数组名[下标]}。
变量内容的删除与取代
- 删除
删除方式:# 或 %。
#:从前开始删除
%:从后开始删除
单个# 或 % ,取最短匹配
两个 # 或 % ,取最长匹配
写法:echo ${变量名 删除方式 匹配字符}
lyt@n55sl:~$ path=${PATH}
lyt@n55sl:~$ echo $path
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
删除最后一个目录
lyt@n55sl:~$ a=${path%:*}
lyt@n55sl:~$ echo $a
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
- 取代
echo ${变量/旧字符串/新字符串}
关键词 / 一个代表仅替换第一个匹配的,两个代表替换所有匹配的
lyt@n55sl:~$ echo $path
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
将所有local替换为大写
lyt@n55sl:~$ echo ${path//local/LOCAL}
/usr/LOCAL/sbin:/usr/LOCAL/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/LOCAL/games:/snap/bin