BIOS(主板) =>MBR(硬盘引导)=>Bootloader(grub)=>kernel=>systemd=>系统初始化=》shell
## 查看内核版本
$ grub2-editenv list
$ uname -r
## 进入home 并执行 ls命令
$ cd /home ; ls -lih
## 给当前用户添加1.sh的执行权限
$ chmod u+x 1.sh
## 使用bash 解析1.sh 并执行
$ bash 1.sh
## 调用系统自带shell执行1.sh (必须要拥有1.sh的执行权限)
$ ./1.sh
## 在当前终端下创建一个bash的子进程执行1.sh
$ bash ./1.sh
## 在当前进程下执行1.sh (可能对当前环境造成影响 例如 1.sh中有cd 命令,执行完1.sh后 当前环境目录会发生改变)
$ source ./1.sh
$ .1.sh
# 我是注释
echo "test"
# 多行注释
:<<!
echo "comment"
echo "comment"
echo "comment"
!
# 多行注释
:<<!
echo "comment"
echo "comment"
echo "comment"
!
内建命令不需要创建子进程
内建命令对当前shell生效
管道和信号一样,也是进程通信的方式之一,匿名管道(管道符)是Shell编程经常用到的通信工具
管道符是"|",将前一个命令执行的结果传递给后面的命令
一个进程默认会打开标准输入、标准输出、错误输出三个文件描述符
[1] 输入重定向符号"<”
read var [2] 输出重定向符号
“>” : 将后面文件的内容清空后 ,清空后再讲前面的内容输入进’>'后面的文件
“>>”:将 输入内容追加到‘>>’后面的文件中(现有文件内的下一行)
“2>”: 错误重定向 将错误信息输出到后面文件中
“&>”: 无论信息是否错误 都输入到后面的文件中
标准输入(standard input)的文件描述符是 0
标准输出(standard output)是 1
标准错误(standard error)是 2
[3] 输入和输出重定向组合使用
## 将1.txt文件中的内容赋值给var2
$ read var2 < 1.txt
## 输出var2对象
$ echo $var2
##
$ echo $var2 > 1.txt
$ echo $var2 >> 1.txt
$ echo $var2 2> 1.txt
$ echo $var2 &> 1.txt
执行下面命令会产生一个a.sh(a.sh的内容是echo “hello bashi”)
#!/bin/bash
cat > a. sh <<EOF
echo "hello bashi"
EOF
变量值有空格等特殊字符可以包含在””或”中
等号两边不可以有空格
$ a=123
## 使用let为变量赋值
$ let a=10+20
## 将命令赋值给变量
$ l=ls
## 将命令结果赋值给变量,使用$()或者``
$ let c=$(ls -l /home)
$ let c=`ls -l /home`
${变量名}称作对变量的引用
echo ${变量名}查看变量的值
变 量 名 在 部 分 情 况 下 可 以 省 略 为 {变量名}在部分情况下可以省略为 变量名在部分情况下可以省略为变量名
##
$ string1="hello linux"
$ echo $string1
$ echo ${string1}
变量的默认作用范围:默认只在自己的shell范围内。
export命令用于将shell变量输出为环境变量,或者将shell函数输出为环境变量
$ string1="hello linux"
## export让子进程访问父进程的变量(变量的导出)
$ export string1
## unset 删除变量
$ unset string1
环境变量:每个Shell打开都可以获得到的变量
$? : 查看上一条shell命令是否执行成功(0 表示执行成功,1表示执行失败)
$$ : 当前的进程pid
$0 :当前进程的名称
位置变量: $1 、$2… 9 、 9 、 9、{10}
## env命令用于显示系统中已存在的环境变量,以及在定义的环境中执行指令
$ env
$ echo $USER
$ echo $PATH
## $? 查看上一条shell命令是否执行成功(0 表示执行成功,1表示执行失败)
$ echo $?
## 当前的进程pid
$ echo $$
## 当前进程的名称
$ echo $0
##
$ ./1.sh -a -l
# 结果:
# -a
# -l
# _
$ ./1.sh -a -l jj
# 结果:
# -a
# -l
# jj
1.sh 文件内容
#!/bin/bash
# $1 、$2......$9 、${10}
port1=$1
port2=$2
# 如果$3 为空值则输出_
port3=${3-_}
echo $port1
echo $port2
echo $port3
/etc/profile
/etc/profile.d/
/etc/bashrc
~/.bash_profile
~/.bashrc
[1] 登录用户不同,加载配置文件不同
当使用 su - 用户名切换用户时会加载 (login shell)(执行顺序依次为):
/etc/profile
~/.bash_profile
~/.bashrc
/etc/bashrc
当使用 su 用户名切换用户时会加载:
~/.bashrc
/etc/bashrc
[2] 根据用户分类
root 用户和普通用户共用的配置文件:
/etc/profile
/etc/profile.d/
/etc/bashrc
当前用户拥有的配置文件:
~/.bash_profile
~/.bashrc