shell 相关基本操作
shell 基础
shell中的脚本通常就是控制台中的语句,将这些语句结合到一个文件中,就组成了脚本。脚本的第一行通常是#!/bin/bash开通,这行的作用是指定用哪个shell。可以cat /etc/shells查看当前操作系统支持哪些shell。
在控制台中我们使用 ; 隔开多条语句,在shell脚本中则是一行命令独立一行。通常我们会以*.sh结尾来作为一个脚本名称,另外会将其权限设置为可执行权限:chmod u+x *.sh。
管道与重定向
管道的符号是:|,作用是将前一个命令的操作结果传给第二个命令:ps | cat,echo 123 | ps
重定向的符号:
1: 输入重定向:<;
2:输出重定向>,>>,2>,&>;
输入输出组合使用:
1 | cat > /path/to/a/file << EOF |
> : 先会清空文件然后再输出到文件
>> :追加到文件中,会在最后一行添加
2> :如果出现异常,将异常结果输出到文件中

&> : 不管结果对错都输入到文件中

shell 脚本执行的几种方式
bash xxx.sh : 开了一个子进程bash执行脚本,可以不需要shell文件有可执行权限,就可以执行脚本;
./xxx.sh :同bash,不过需要脚本有可执行权限;
source xxx.sh :在当前shell内去执行脚本,脚本可以没有可执行权限;
. xxx.sh :source的缩写;

变量定义与使用
1 | NAME=chenzhijun |
上面中=两边不能有空格,不然的话会将 NAME 识别成一个命令来报错。使用变量 NAME 的时候只需要带上$即可。
环境变量
env set 获取环境变量;
$PS1可以修改总端显示
预定义变量
$? : 使用echo $?可以获取上一条命令执行的结果,成功为0,失败为1
$$ :获取当前的pid
$0 :当前进程名称

执行的方式不同,$0的值也不同。
位置变量
1 |
|
环境变量配置文件
1 |
|
/etc/profile* 是所有用户通用的。~/.bash*是用户特有的。
用户登录分为login shell,nologin shell 。如果是su - user是login-shell ,如果是su user是nologin shell
如果在每个文件第一行加入echo xxx,可以看到如下加载顺序:

要注意作用域的问题,shell执行的时候通常是一个subshell,也就是一个子进程shell,要注意变量是否可以传递过去。一般可以用source /etc/profile来重加载;也使用export也可以将当前shell的变量传递subshell中。

上面的方式是在/etc/profile文件最后面增加了aaa变量,使用source可以加载到当前shell中,使用export可以在subshell(bash命令)也同样获取到aaa的值。
常用的一些脚本命令
- 找出dir目录下文件名带
xxx的文件 :find /dir -name *xxx*; - 找出dir目录下文件中带
xxx内容的文件 :grep -r "xxx" /dir; - 找出dir目录下文件名带
aaa的文件并且文件路径中有bbb然后查找这些文件中含有ccc的文件,替换这些文件中的ddd为eee:find /dir -name "*aaa*"|grep 'bbb'|xargs grep 'ccc' -l|xargs sed -i 's/ddd/eee/g';grep -l为输出全路径。