运行Login Bash脚本共会初始化四个配置文件,分别是全局配置文件/etc/profile,以及用户配置文件~/.profile, ~/.bash_login, ~/.bash_profile
全局配置:/etc/profile。为所有登录的用户添加执行的命令。
如果想添加全局配置,除了可以直接修改/etc/profile文件,还可以预设一个文件夹profile.d,在profile文件中设置一个for循环执行其中的所有.sh配置文件。这样可以降低修改文件带来的风险。
父shell使用fork命令启动一个子shell
子shell会继承父shell的环境变量,函数等信息
子shell执行
子shell结束,销毁相关环境
父shell获取子shell的退出状态
source:读取配置文件中的所有配置。
eval:将上一次命令的执行结果再作为一次命令进行执行
dirname $0: dirname表示获取路径名,$0参数表示当前脚本执行的路径,推荐使用该方法替换pwd获取当前脚本所在的路径名。
在bash命令正式执行之前,会先对输入的命令行进行解析,解析共可分为7部分,在解析过程中会严格按照以下顺序执行:
花括号扩展(brace expansion):将花括号内的数字或字母逐个展开,如果有多个连续花括号则会对其中的内容进行排列组合,例如:{1… 10} {2, 4, 6} {a… f},如果不符合以上规范则不进行任何操作。
波浪线扩展(tilde expansion):~会被扩展为当前用户的主目录,即HOME值,例如:cd变量扩展(parametervariableexpansion):将HOME值,例如:cd ~ 变量扩展(parameter variable expansion):将HOME值,例如:cd 变量扩展(parametervariableexpansion):将后的变量名替换为变量值,例如:echo $HOME
算数扩展(arithmetic expansion):进行整数算数运算,例如:((i++)),((10 > 5)), ((11 * 12))
命令替换(command substitution):将命令执行的结果赋值给一个变量,例如:today = $(date + %F), line = $(grep xxx yyy)
词的拆分(Word splitting):将变量值按照空格符进行拆分
路径名扩展(pathname expansion):将通配符扩展为文件名,通配符共有和?两种,其中代表任意长度的字符串,?代表长度为1的任意字符,[1-9]代表其中的任意一个字符, @与*的作用类似,但在@中,分割符将不会被替换。
变量赋值:name=value
变量引用:name注意事项:=两边不允许出现空格,name 注意事项:=两边不允许出现空格,name注意事项:=两边不允许出现空格,name是name的简写命令替换:{name}的简写 命令替换:name的简写命令替换:(),将一条命令语句赋值给一个变量。
$?: 上个命令的结束状态
$!: 最后一个后天进程的pid
$0: 脚本或函数的名字
$n: 脚本或函数的第n个参数
$#: 脚本或函数的参数个数
$@: 脚本或函数的所有参数
$$: 当前脚本的pid
$UID: 当前用户的uid
$LOGNAME: 用户名
$HOSTNAME: 主机名
$RANDOM: 生成1-32767之间的随机数
$SECONDS: 当前脚本已经消耗的秒数
$PWD: 当前工作路径
$PATH: 命令搜索的路径名
$LANG: locale,设置地区语言
$LC_ALL: locale
$TERM: 终端类型
$EDITOR: 设置默认的编辑器类型
环境变量的永久设置:export name=value
单个脚本设置只需:name=value
if
case
while
until
for var in list
一个进程运行时,内核会为其准备3个默认的文件描述符
STDIN(0), STDOUT(1), STDERR(2)
默认情况下,输出会被定向到屏幕,错误也会对定向到屏幕。可以通过重定向对应的文件描述符使输出与错误输出到文件上。
echo xxx > file // 重写
echo xxx 1> file // 与上一个相同
echo xxx >> file // 续写
read line < file // 输出重定向
echo xxx 2> file // 错误输出重定向
echo xxx > /dev/null 2>&1 // 标准输出与错误输出全部不记录
echo xxx &> /dev/null // 与上一条相同
echo xxx >> log 2>&1 // 输入输出全部定向到log文件
可以在if,case,while,for语句之后接上重定向,代表内部所有语句均被重定向
还可以使用()与{}包含多条语句,代表其中的语句均被重定向。
其中()会新建一个sub shell其内部的所有变量外部均感知不到。
函数需要先定义后使用。
函数内部默认使用的都是全局变量,可以使用local声明局部变量。
bash -n 检查语法
bash -x 打印执行过程