快速学习shell笔记
一. 基础理解
-
$SHELL是全局共享的读取解析器的环境变量,全局环境变量是所有的shell脚本都可以读取使用的变量;
-
创建shell脚本,首行要添加解析器
#!/bin/bash #默认解析器
- 关于配置文件
(1)全局配置:
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
(2)个人配置:
~/.bash_profile
~/.bashrc
- 交互式shell和非交互式shell,登录shell和非登录式shell
简单理解,交互式和非交互式其实就是用户的参与,老实说还没感觉到有什么作用,初学期用的多交互式,后面写shell script就换非交互式;登录shell环境和非登录shell环境总要是,不同的用户使用host,有些不需要通过用户密码登录,然后就可以使用一些功能,有不少是有nologin权限的
执行exit命令,退出一个shell(登录或非登录shell);
执行logout命令,退出登录shell(不能退出非登录shell)。
[root@93bef2b01622 etc]# cd ..
[root@93bef2b01622 /]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
[root@93bef2b01622 /]#
使用./test.sh或者 bash ./test.sh执行脚本的时候,是开启一个子shell,这个子shell能继承上一个父shell的变量,而这个子shell的变量,随着子shell的退出而消失。当我们用. test.sh 或者source test.sh时,不开启子shell,在当前shell运行,子shell中的所有值都影响当前。
一般我们对shell进行一些配置的时候,通常都是对~/.bashrc 和/etc/bashrc这两个文件进行一些配置。
二. 变量
全局变量
echo $PATH # 设置命令搜索路径
echo $HISTFILE #查看历史命令记录列表,/root/.bash_history
echo $LANG # 设置当前语言环境,zh_CN.UTF-8
echo $HOME # 设置当前用户主目录
echo $SHELL #设置当前默认解析器
echo $PWD # 显示当前所在目录
...
name=it
name=it02 #修改
$name #查询
# ${name}
unset name #删除变量
# 定义只读变量,无法unset删除,重启比较快
readonly name=12;
# 定义可以父子脚本共享的变量,或者说父脚本定义,子脚本可以继承/读取
export age=12;
特殊变量
格式 | 作用 | 备注 |
---|---|---|
$n | 表示用于接受脚本执行时传入的参数,其中$1~$9 表示获取第一个参数~第9个传入的参数,$0 表示当前脚本文件的名称,若参数超过10个,获取对应参数格式为${index} ; | |
$# | 表示当前脚本输入参数的个数 | |
$* $@ | 获取所有的输入参数,如果使用双引号标记,前者获取一个拼接字符串,后者获取一个列表字符串,可以当成数组 | |
$? | 用于获取上一个shell命令的退出状态码,或者是函数的返回值,每一个shell命令其实都有一个返回值,用于说明命令执行结果 | |
$$ | 用于获取当前shell环境的进程的id号,每执行一个shell命令就是开启一个shell子进程 |
添加环境变量
vim /etc/profile # G可以自动定位到文件末尾,g可以自动定位到文件头
# 开始插入环境变量到profile
export VAR=var
# 保存退出,重新加载配置文件
source /etc/profile
# 可以查询配置成功
echo $VAR
切换shell环境
# 切换成登陆环境,执行shell
sh/bash -l/--login xx.sh #先按照流程加载登陆环境配置文件初始化环境变量后再执行文件
# 切换成非登陆环境,执行shell
bash
sh/bash xx.sh
环境变量的删除除了要将/etc/profile文件的对应变量删除,还要unset 变量名,目的是清除内存中的变量;
识别当前环境可以用echo $0
输出-bash | 登陆环境 |
输出bash | 非登陆环境 |
字符串变量
可以通过
''
""
以及不使用引号创建,但是''
创建的字符串在内部含有别的变量时不会被解析,而是原样输出;不用引号也可以解析字符串内部含有的变量,但是不能包含空格;推荐""
创建字符串;
echo ${var:start:length} #截取var字符串从start起始位置开始length长度的字符串
echo ${var:start} #截取var字符串从start起始位置开始至右边全部剩余字符串
echo ${var:0-start:length} #截取var字符串从右边第start个字符开始,向右截取length长度字符串
echo ${var:0-start}
echo ${var#*chars} #截取var字符串从左边第一个chars字符向右剩余的字符串
echo ${var##*chars} # 截取var字符串从左边最后一个chars字符向右剩余的字符串
echo ${var%chars*} #截取car字符串从右边第一个chars左边剩下的字符串
echo ${var%%chars*}
三.test指令
一般用于文件的测试,也可以对整型数值,字符串进行相关的判断;
参数 | 说明 |
---|---|
-e 文件名 | 如果文件存在则为真 |
-r 文件名 | 如果文件存在且可读则为真 |
-w 文件名 | 如果文件存在且可写则为真 |
-x 文件名 | 如果文件存在且可执行则为真 |
-s 文件名 | 如果文件存在且至少有一个字符则为真,也就是不为空 |
-d 文件名 | 如果文件存在且为目录则为真 |
-f 文件名 | 如果文件存在且为普通文件则为真 |
-c 文件名 | 如果文件存在且为字符型特殊文件则为真 |
-b 文件名 | 如果文件存在且为块特殊文件则为真 |
四.输入输出重定向
就是将命令执行后的结果从默认的终端转移到文件
命令 | 说明 |
---|---|
command > file | 将输出重定向到 file。 |
command < file | 将输入重定向到 file。 |
command >> file | 将输出以追加的方式重定向到 file。 |
n > file | 将文件描述符为 n 的文件重定向到 file。 |
n >> file | 将文件描述符为 n 的文件以追加的方式重定向到 file。 |
n >& m | 将输出文件 m 和 n 合并。 |
n <& m | 将输入文件 m 和 n 合并。 |
<< tag | 将开始标记 tag 和结束标记 tag 之间的内容作为输入。 |
指令记录:
echo:输出打印到终端
echo ${var}:打印变量
echo ${#var};打印字符串的长度
touch:创建一个`.sh`脚本文件
vim:进入脚本文件`.sh`的编辑环境
cat:查看文件内容
pwd:查看当前目录
chmod:添加用户对于文件的操作权限,u,g,o,a表示不同类型的用户,所有者,所属组,以及其他人,所有用户;
+/-/=表示添加/删除/设置 权限
r/w/x表示读/写/执行权限,所代表的权限数字4/2/1
对应的不同用户类型具有不同的权限,比如u=rwx,就是7;g=r-x=5,o=r-x=5,也就是755;
ls:查看文件列表详情,ls -al
env:查看系统环境变量
set:查看各种变量函数等
alias:定义命令的别名
alias psList="ps -aux"
unalias psList
echo -n:输出不换行
echo -e:输出字符串可以内部含有转义字符并解析
printf:打印
read:读取包括重定向的字符串,默认从终端读取
read -n(字符串长度限制) -s(静默模式,适合密码输入) -p(添加提示信息,后面跟字符串) -t(设置时间限制) var1 var2 ...
#使用 . 号来引用test1.sh 文件
. ./test1.sh
# 或者使用以下包含文件代码
# source ./test1.sh