一直以为Unix时间戳和JavaScript中的Date.now()的结果一致,但是最近才发现,Date.now()是精确到毫秒级的,去掉末尾的3位就可以和时间戳完美匹配。

用户自定义变量

变量定义

1
name=value

注意等号的前后不能有空格,如果value是字符串且有空格必须使用引号.例如以下的定义都是非法的!

1
2
3
4
x= 1
x =1
x = 1
x=hello world

因为如果有空格的话,前面的单词会被解析为系统命令,而后面的参数会被解析为选项.

使用变量只需要在变量前面加上$即可,例如:

1
2
a=1
echo $a # 1

*注意:*双引号和单引号的区别:单引号中的变量相当于ES6中的模板字符串,而单引号中的内容完全就是字符串,丧失了原有的变量替换.
*注意:*shell中的变量默认都是字符串,例如:

1
2
3
4
x=1
y=2
z=$x+$y # 1+2
echo $z

变量叠加

相当于拼接字符串,例如:

1
2
3
4
5
6
x=123
x="$x"456
echo $x # 123456
# 我们也可以使用下面的方式
x=${x}789
echo $x # 123456789

Tips:使用set -u命令后,如果我们使用未定义的变量将会得到明确的错误信息(默认显示为空),可以帮助我们排错.

变量删除

1
2
3
a=1
echo $a
unset a # 删除变量

Bash环境变量

首先我们要明确一点:环境变量是全局变量(当前shell和子shell),而用户自定义变量是局部变量(当前shell),在shell中我们输入bash或者sh即可进入到子shell.我们可以使用pstree显示进程树得到通过ssh连接上的shell.

设置环境变量

1
2
3
4
export 变量名=变量值
# 或
变量名=变量值
export 变量名

我们unset子shell中的环境变量,父shell中的环境变量仍然存在.可以使用set或者env得到系统环境变量.

PS1环境变量

1
echo $PS1 # \u@\h:\w\$

分别表示:用户名@主机名:当期路径 提示符,我们完全可以更改成自己的,例如:

Linux PS1环境变量

语系变量

语系变量决定了命令的显示语言

1
$ locale # 查看当前语系,也可以使用echo $LANG命令查看当前语系

位置参数变量

linux位置参数变量

例如有以下的add.sh

1
2
3
4
5
#!/bin/bash
num1=$1
num2=$2
sum=$(($num1+$num2))
echo $sum

在命令行中我们之一这样运行脚本:sh add.sh 10 20

$*$@都可以取得命令的所有参数,不同的是$*将参数看做了一个整体,例如有以下的test.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash

echo 'test $*'
for i in "$*"
do
echo "The parameter is: $i"
done

echo 'test $@'
for y in "$@"
do
echo "Parameter:$y"
done

echo "The length of the parameters is $#"

运行结果:

1
2
3
4
5
6
7
8
9
10
root@iZ28pw6rq5sZ:~# ./test.sh 1 2 3 4 5
test $*
The parameter is: 1 2 3 4 5
test $@
Parameter:1
Parameter:2
Parameter:3
Parameter:4
Parameter:5
The length of the parameters is 5

预定义变量

linux预定义变量

read命令

该命令用于接收标准输入,并将输入保存到变量

1
2
3
4
5
6
7
8
9
#!/bin/bash
read -p "Please input you name: " -t 10 name
echo "your name is:$name"
read -p "Please input you password:" -s password
echo -e "\n"
echo "your password is:$password"
read -p "Please input your sex [M/F]" -n 1 sex
echo -e "\n"
echo "your sex is $sex"

*注意:*执行脚本的时候使用chmod 755 read.sh然后./read.sh的方式执行,否则会出现参数错误.

环境变量配置文件

source命令让配置文件立即生效,可以简写为.

环境变量配置文件的加载顺序

umask查看系统的默认权限.注意:文件的最高权限是666(即创建一个文件默认是没有执行权限的,安全性的考虑),目录的最高权限是777(目录的执行权限表示能否进入这个目录).定义了默认的需要排除的权限,请看下面的例子:

1
2
3
4
5
6
$ umask
$ 002 # -------w-,准备丢弃的权限是 u-w
$ touch a;ll a # 创建文件
$ -rw-rw-r-- 1 consoles consoles 0 4月 16 09:14 b # 即从 -rw-rw-rw-中取消的用户的w权限,不能简单理解为数字的减法
$ mkdir b;ll # 创建目录
$ drwxrwxr-x 2 consoles consoles 4096 4月 16 09:18 b/ # 即从 drwxrwxrwx中取消用户的w权限
  • 历史命令保存在~/.bash_history,注意:本次登陆的历史命令保存在内存,下一次登陆的时候才会同步到此文件.
  • 本地终端前欢迎信息/etc/issue,详见自定义登陆欢迎信息.
  • 远程终端前欢迎信息/etc/issue.net,但是不支持转义符号,是否显示此欢迎信息由ssh配置(/etc/ssh/ssh_config)决定,在此文件的最后追加Banner /etc/issue.net才可生效
  • 登陆后欢迎信息/etc/motd

Shell中输出多行文本可以使用here document(cat EOF)

例如n模块中的这行代码,使用说明详见git osc