Shell 是指是一个用 C 语言编写的程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口。它接收用户输入的命令并把它送入内核去执行。
实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。不仅如此,Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序。Shell编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,
Ken Thompson 的 sh
是第一种 Unix Shell
一、Shell 脚本(Shell Script)
shell脚本就是由Shell命令组成的执行文件,可以加入一些逻辑操作(if else for),将一些命令整合到一个文件中,进行处理业务逻辑,脚本不用编译即可运行。它通过解释器解释运行,所以速度相对来说比较慢。
- 查看当前系统的shell类型
echo $SHELL
>/bin/bash
- 查看当前系统环境支持的shell
[root@linux-node1 ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
Shell 环境变量
$PATH
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/jdk1.8.0_144/bin:/usr/local/jdk1.8.0_144/jre/bin:/root/bin
1.1 脚本格式
#!/bin/bash #首行,指定解析Shell 命令的命令解析器
# 如果首行不写,使用默认 /bin/sh
注释:
1 单行注释:#开头
2 多行注释::<<字符 … 字符(将字符们作为输入重定向到啥都不干)
1.2 脚本的执行
- 加权限
chmod a+x xx.sh
或者
chmod u+x xx.sh
./xx.sh (启动子bash(名字叫脚本名),在子bash中执行脚本内命令)
或者
sh xx.sh #很少用 (启动子bash,在子bash中执行脚本内命令)
或者
source xx.sh #(不启动子进程,直接在当前环境运行脚本内命令)
- 开发规范
1 不要中文注释
2 成对内容一次性写
3 缩进(风格类似go)
1.3 变量
1.3.1 普通变量(本地变量)
只能在当前进程中使用
1, 变量名=变量值(不可以有特殊字符)
2,变量名=‘变量值’ (原封不动输出)
3,变量名=“变量值” (变量套变量)
#定义完成,必须要赋值,=前后不能有空格
# tmp = 666 和 tmp == 666 等价
tmp=666 # 默认以字符串处理
1.3.2 环境变量
一般大写
可以理解为全局变量(针对当前操作系统)
- 系统自带的
– PWD
– SHELL
- 用户自定义的
将普通变量变成环境变量
GOPATH=/home/xxx/golang/ #普通环境变量
set GOPATH=/home/xxx/golang/ # 系统环境变量
export GOPATH=/home/xxx/golang/
~/.bashrc # 针对当前用户生效
/etc/profile # 设置环境变量,对整个操作系统下所有用户生效
1.3.3 位置变量
执行脚本的时候,可以给脚本传递参数,在脚本内部接收这些参数
$0
: 脚本文件的名字
$1
: 第一个参数
$2
: 第二个参数
…
1.3.4 特殊变量
$#
: 获取传递的参数个数
$@
: 给脚本传递的所有参数
$?
:上一条命令的返回值(0代表成功,非0代表失败)
(若上一条命令是执行脚本—>获取脚本最后一条命令的返回值)
直接在终端:echo $?
(上一条命令的执行状态)
$$
:执行脚本的进程号
1.3.5 命令变量
取命令执行之后的结果值。
定义方式一: 变量名=`命令` 注意:`是反引号
定义方式二: 变量名=$(命令)
命令变量值只在定义时确定,不会随着后续命令输出的改变而改变
变量访问
普通变量取值
1、$变量名
2、${变量名} #(限定变量名范围)
3、"$变量名" (变量值作为字符串)
4、标准使用方式 "${变量名}" (最推荐)
unset 变量名
字符串截取
${变量名:起始位置:截取长度}
echo ${a:0-3:2} (从倒数第三个开始截取,向后截取2个字符)
默认值:
${变量名:-默认值} (变量值存在则输出变量值,不存在则输出默认值)
${变量名:+提示信息} (变量存在则输出提示信息)
二、常用 Shell 命令
2.1 which
显示 shell 命令的完整路径
which [options] [--] programname [...]
2.2 echo
显示一行文本
echo [SHORT-OPTION]... [STRING]...
echo LONG-OPTION
Echo the STRING(s) to standard output.
-n
do not output the trailing newline
2.3 env
在修改过的环境中运行一个程序
env [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...]
在环境中将每个NAME设置为VALUE并运行COMMAND。
不加任何参数,列出当前终端的环境变量
2.4 wget
2.5 curl
curl是一个使用支持的协议(DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTP, TELNET和TFTP)从服务器传输数据或向服务器传输数据的工具。该命令被设计成在没有用户交互的情况下工作。
curl提供了大量有用的技巧,如代理支持、用户认证、FTP上传、HTTP发布、SSL连接、cookie、文件传输恢复、Metalink等。
Curl由 libcurl 提供所有与传输相关的功能。
curl [options] [URL...]
-F, --form <name=content>
(HTTP) 这允许curl 模拟用户按了提交按钮的已填入的表单。这将导致 curl 根据RFC 2388 使用 Content-Type multipart/form-data
POST数据。这允许上传二进制文件等。
要将“content”部分强制为文件,请在文件名前面加上@符号。
要从文件中获取内容部分,请在文件名前加上符号<
@和<的区别在于,@使一个文件作为文件上传附加到post中,而<使一个文本字段,并仅从文件中获取该文本字段的内容。
-X, --request <command>
(HTTP)与HTTP服务器通信时使用的自定义请求方法
-H, --header <header>
(HTTP)获取网页时使用的额外 header。您可以指定任意数量的额外header。
curl -H "rate:300" -H "domain:music" 127.0.0.1:8080/
2.6 usermod
usermod命令修改系统帐户文件,以反映在命令行上指定的更改。
usermod [options] LOGIN
-a, --append
将用户添加到补充组(supplementary group(s))。仅与-G
选项一起使用。
-G, --groups GROUP1[,GROUP2,...[,GROUPN]]]
补充组列表