1. 脚本执行方式
# 如果直接使用文件路径,如果没有x权限会提示权限不够
./test.sh
# 使用bash或者sh解释器不需要获取执行权限
bash test.sh
sh test.sh
上面几种方式都是通过开启子进程的方式来启动的bash:
# 通过pstree命令可以查看到进程树
# 都是在bash终端下开启了一个子进程(bash or ./test.sh)
sshd——sshd——bash——test.sh——sleep # ./test.sh
sshd——sshd——bash——test.sh——sleep # bash test.sh
# 直接使用bash
source test.sh
. test.sh
# 使用pstree查看进程树,直接在bash下面执行了,没有开启子进程
sshd——sshd——bash——sleep
上面的进程树,
sshd
下面的bash
就是我们在xshell
或者mobaxterm
中开启的shell
进程,如果使用source
直接在当前bash下执行,按下ctrl+c
,就会退出整个终端
2.输入、输出
# 将用户输入的值绑定的key1变量中
# 默认不支持\字符,需要使用-r选项支持\字符
read key1
# -p增加提示
# -s 输入的内容敲回车后不显示在终端上
read -s -p "请输入用户名" key2
# 设置输入超时时间
echo $key1"123"
文件描述符:
- 1:标准输出
- 2: 标准错误输出
- 0:标准输入
以ls
命令为例:
# 将标准输出重定向到info.log中
ls test.sh > info.log
# 如果test.sh不存在,上述命令还会在终端上打印错误信息
# 将标准错误输出重定向到error.log中: 2>
ls test.sh 2> error.log
# 同时将标准输出和标准错误输出重定向到不同的文件中
ls test.sh > info.log 2> error.log
# 同时将标准输出和标准错误输出重定向到相同文件中
ls test.sh &> runtime.log
# 标准输出重定向到错误输出
ls test.sh 1>&2
# 标准错误输出重定向到标准输出
ls test.sh 2>&1
虽然标准输出和标准错误输出互相转换在终端中看不出本质区别,但是显示的通道是不一致的
例子:将标准输出重定向到文件,将错误输出重定向到标准输出从而实现info和error都导入到同一文件中
ls test.sh > info.log 2>&1
linux黑洞
在linux中,有一个特殊的设备
/dev/null
,无论写入什么都会被系统吞噬。
如果有一些错误信息
3.各种引号
单引号
可以屏蔽特殊符号(双引号不可以)
num=1
echo $num # 1
echo "$num" # 1
echo '$num' # $num
反引号
反引号的作用是进行命令替换,输出命令的执行结果
# 将/var/log下的日志文件打包
tar -zcf /root/log-`date` /var/log
4.变量
命名规则
- 不能包含特殊符号,仅仅支持大小写字符 + 下划线(_)
- 不能以数字开头
# 定义变量,注意等号两边不能有空格
a=1
# 输出
echo $a
# 取消变量定义
unset a