一, Shell运行环境概念
- bash是一个进程
- bash下还可以再重新启动一个shell,这个shell是sub shell,原shell会复制自身给它
- 在sub shell中定义的变量,会随着sub shell的消亡而消失
- () 子shell中运行
- {} 当前shell中执行
- $$ 当前脚本执行的pid
- & 后台执行
- $! 运行在后台的最后一个作业的pid(进程ID)
echo $$ # 查看当前进程pid
bash # 启动一个bash
exit # 退出
- 启动一个子shell
- 赋值完毕后子shell就消亡了,所以取不到a,所以拿到的是外面定义的a
- 子shell和当前shell不会相互影响
- 大括号表示当前shell,所以这边2个都可以正常打印
- 后台执行
- jobs:查看进程
- 把终止的程序调出来
sleep 15 # 休眠15s
ctrl+Z # 暂停(Z要大写)
jobs # 查看进程
bg + 任务号 # 调出来,继续执行休眠 bg:BackGround 后台
fg + 任务号 # 停止休眠 fg:ForeGround 前台
二, Shell运行环境
- shell首先是一个工作环境,有很多变量可以供我们使用
- set可以获得当前所以变量
- env可以获得可以传递给子进程的变量
- export aa=bbbb 把私有变量导出
三, Shell输入输出
- Read 用来读取输入,并赋值给变量
- echo . printf 可以简单输出变量
- > file 将输出重定向到另一个文件,等价于tee
- >> 表示追加,等价于tee -a
- < file 输入重定向
- | 表示管理,也就是前一个命令的输出传入下一个命令的输入
四, Shell脚本的执行方式
执行shell脚本一般有2种方式
# 方法1
bash xxx.sh
# 方法2
chmod +x xxx.sh # 赋执行权限
./xxx.sh # ps:如果配置了环境变量,直接xxx.sh就好
五,shell函数
# 定义函数
functionName(){
代码块
}
# 执行函数
functionName
ps:执行函数的时候,一般最多只能传9个值,如果超过9的话,需要加大括号{},否则就取不到想要的值
$ cat test2.sh
func()
{
echo "第一个参数为 $1!"
echo "第二个参数为 $2!"
echo "第十个参数为 $10 !"
echo "第十个参数为 ${10} !"
echo "第十一个参数为 ${11} !"
echo "参数的总个数有 $# 个"
}
func a b c d e f g h i j k l m n
-----------------
# 输出结果为
“第一个参数为 a!”
“第二个参数为 b!”
“第十个参数为 a0 !”
“第十个参数为 j !”
“第十一个参数为 k !”
“参数的总个数有 14 个”