Shell 基础 —— 变量和配置文件
一直以为Unix时间戳和JavaScript中的Date.now()
的结果一致,但是最近才发现,Date.now()
是精确到毫秒级的,去掉末尾的3位就可以和时间戳完美匹配。
用户自定义变量
变量定义
1 | name=value |
注意等号的前后不能有空格,如果value是字符串且有空格必须使用引号.例如以下的定义都是非法的!
1 | x= 1 |
因为如果有空格的话,前面的单词会被解析为系统命令,而后面的参数会被解析为选项.
使用变量只需要在变量前面加上$
即可,例如:
1 | a=1 |
*注意:*双引号和单引号的区别:单引号中的变量相当于ES6中的模板字符串,而单引号中的内容完全就是字符串,丧失了原有的变量替换.
*注意:*shell中的变量默认都是字符串,例如:
1 | x=1 |
变量叠加
相当于拼接字符串,例如:
1 | x=123 |
Tips:使用set -u
命令后,如果我们使用未定义的变量将会得到明确的错误信息(默认显示为空),可以帮助我们排错.
变量删除
1 | a=1 |
Bash环境变量
首先我们要明确一点:环境变量是全局变量(当前shell和子shell),而用户自定义变量是局部变量(当前shell),在shell中我们输入bash
或者sh
即可进入到子shell.我们可以使用pstree
显示进程树得到通过ssh连接上的shell.
设置环境变量
1 | export 变量名=变量值 |
我们unset
子shell中的环境变量,父shell中的环境变量仍然存在.可以使用set
或者env
得到系统环境变量.
PS1环境变量
1 | echo $PS1 # \u@\h:\w\$ |
分别表示:用户名@主机名:当期路径 提示符,我们完全可以更改成自己的,例如:
语系变量
语系变量决定了命令的显示语言
1 | $ locale # 查看当前语系,也可以使用echo $LANG命令查看当前语系 |
位置参数变量
例如有以下的add.sh
1 |
|
在命令行中我们之一这样运行脚本:sh add.sh 10 20
$*
和$@
都可以取得命令的所有参数,不同的是$*
将参数看做了一个整体,例如有以下的test.sh
1 |
|
运行结果:
1 | root@iZ28pw6rq5sZ:~# ./test.sh 1 2 3 4 5 |
预定义变量
read命令
该命令用于接收标准输入,并将输入保存到变量
1 |
|
*注意:*执行脚本的时候使用chmod 755 read.sh
然后./read.sh
的方式执行,否则会出现参数错误.
环境变量配置文件
source
命令让配置文件立即生效,可以简写为.
umask
查看系统的默认权限.注意:文件的最高权限是666(即创建一个文件默认是没有执行权限的,安全性的考虑),目录的最高权限是777(目录的执行权限表示能否进入这个目录).定义了默认的需要排除的权限,请看下面的例子:
1 | $ umask |
- 历史命令保存在
~/.bash_history
,注意:本次登陆的历史命令保存在内存,下一次登陆的时候才会同步到此文件. - 本地终端前欢迎信息
/etc/issue
,详见自定义登陆欢迎信息. - 远程终端前欢迎信息
/etc/issue.net
,但是不支持转义符号,是否显示此欢迎信息由ssh配置(/etc/ssh/ssh_config
)决定,在此文件的最后追加Banner /etc/issue.net
才可生效 - 登陆后欢迎信息
/etc/motd