1. Shell 分类
不同的shell具备不同的功能,流行的shell有ash、bash、zsh、ksh、csh等,不同的shell都有自己的特点以及用途。可以通过查看/etc/shells文件中的内容来查看当前主机中包含哪些类型的Shell
# chen @ localhost in ~/Shell [10:34:21]
$ cat /etc/shells
/bin/sh # 是bash的一个快捷方式
/bin/bash # 大多数linux默认的shell,包含的功能几乎覆盖shell所有的功能
/sbin/nologin # 表示非交互,不能登录操作系统
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
/bin/zsh # 功能非常强大,zsh已经取代bash 成为macOS Catalina的默认shell
2. Shell 基本语法结构
2.1. 变量定义
2.1.1. 变量名规则
- 区分大小写
- 不能包含特殊符号
- 不能以数字年开头
- 等号两边不能有空格
2.1.2. 交互式定义变量 (read)
-
语法:
read [选项] 变量名
-
选项
- -[p] 定义提示用户信息
- -[n] 定义字符数,限制变量的长度
- -[s] 不显示用户输入的内容。常用于密码输入
- -[t] 定义超时时间,默认单位为秒(限制用户输入变量值的时间)
-
场景
- 用户自定义变量
[chen@localhost Shell]$ read -p "hello: " name hello: chen [chen@localhost Shell]$ echo ${name} chen [chen@localhost Shell]$ zsh
- 变量值来自文件,每次调用 read 命令都会读取文件中的一行文本
[chen@localhost Shell]$ read -p "file1: " f < file1 [chen@localhost Shell]$ echo ${f} name
- 用户自定义变量
-
问题?
在我电脑上 bash 环境中 read 可以正常使用,切换到 zsh 时 ,read 出现异常read: -p: no coprocess
???[chen@localhost Shell]$ zsh # chen @ localhost in ~/Shell [11:11:35] $ read -p "hello: " name read: -p: no coprocess
2.1.3. 定义有类型的变量 (declare)
- 目的:给变量做一些限制,固定变量的类型,比如:整形、只读
- 语法:
declare [选项] 变量名=变量值
- 常用选项:
- -i 将变量视为整数
- -r 只读变量
- -a 定义普通数组,查看普通数组
- -A 定义关联数组,查看关联数组
- -x 将变量通过环境导出
2.1.4. 本地变量
当前用户自定义的变量。当前进程中有效,其他进程及当前进程的子进程无效
# chen @ localhost in ~/Shell [11:21:28]
$ A=hello
# chen @ localhost in ~/Shell [11:21:42]
$ echo ${A}
hello
# chen @ localhost in ~/Shell [11:21:47]
$ zsh # 开起一个子进程
# chen @ localhost in ~/Shell [11:22:26]
$ echo ${A} # 变量无效
2.1.5. 环境变量
当前进程中有效,并且可以被当前进程的子进程调用
-
env
查看当前用户的环境变量 -
set
查询当前用户的所有变量 -
export
变量名=变量值# chen @ localhost in ~/Shell [11:27:23] $ export name=chen # chen @ localhost in ~/Shell [11:28:31] $ env | grep name name=chen # chen @ localhost in ~/Shell [11:30:57] C:1 $ declare -x age=13 # chen @ localhost in ~/Shell [11:31:07] $ env | grep age age=13 # chen @ localhost in ~/Shell [11:32:42] $ zsh #环境变量可以被当前进程的子进程调用 # chen @ localhost in ~/Shell [11:32:55] $ echo ${name} chen
2.1.6. 全局变量
全局所有的用户和程序都能调用,且继承。新建用户默认也可以调用
$HOME/.bashrc
:当前用户的 bash 信息,用户登录时读取,用于定义别名、umask、函数等$HOME/.bash_profile
:当前用户的环境变量,用户登录时读取$HOME/.bash_logout
:当前用户退出当前 shell 时最后读取,用于定义用户退出时执行的程序等/etc/bashrc
:全局的 bash 信息,所有用户都生效/etc/profile
: 全局环境变量信息,系统和所有用户都生效
说明:
-
以上文件修改后,都需要重新
source
让其生效或者重新推出登录 -
用户登陆系统读取相关文件顺序
/etc/profile
$HOME/.bash_profile
$HOME/.bashrc
/etc/bashrc
2.1.7. 系统变量
shell 本身已经固定好了它的名字和作用
$?
上一条命令执行返回的转态;状态值为0表示正常执行。非0表示异常或错误$0
当前执行的程序或脚本名$#
脚本后面的参数个数$*
脚本后面所有参数,参数作为一个整体输出。每一个变量参数之间以空格隔开$@
脚本后面的所有参数,参数是独立的,也是全部输出$1-$9
脚本后面的位置参数,$1表示第一个位置参数${10}-${n}
扩展位置参数,第10个位置变量必须用{}大括号括起来$$
当前所在进程的进程号$!
后台运行的最后一个进程后(当前终端)!$
调用最后一条历史命令中的参数
2.2. 变量内容的删除和替换
- 一个
%
代表从右往左去掉一个/key/ - 二个
%%
代表从右往左最大去掉/key/ - 一个
#
代表从左往右去掉一个/key/ - 二个
##
代表从左往右最大去掉/key/
# chen @ localhost in ~/Shell [12:06:56]
$ url=www.taobao.com
# chen @ localhost in ~/Shell [12:07:14]
$ echo ${#url} # 变量长度
14
# chen @ localhost in ~/Shell [12:07:19]
$ echo ${url#*.} # 从左到右删除第一个'.*'的内容
taobao.com
# chen @ localhost in ~/Shell [12:15:24]
$ echo ${url%.*}
www.taobao
# chen @ localhost in ~/Shell [12:13:25]
$ echo ${url%.*}
www.taobao
# chen @ localhost in ~/Shell [12:14:13]
$ echo ${url##*.}
com
# chen @ localhost in ~/Shell [12:14:28]
$ echo ${url%%.*}
www