一、Shell概述

1.1Shell是什么

概述:命令行解释器,翻译程序指令给内核请求调用硬件功能。
通俗来讲是:内核和用户之间的命令解释器,相当于一个翻译官。

计算机识别:二进制(依赖ASCII码表翻译)
为用户提供了一个 -》Linux内核(发送请求)-》运行程序
实质:界面系统级程序
用途:启动、挂起、停止、编写程序
编程语言:解释执行的脚本语言,可直接调用Linux系统命令

Shell:Linux中的字符界面(接受命令、将命令转换成二进制)
Windows:有shell吗?操作界面可以称为shell

clipboard.png

1.2 Shell分类

1.Bourne Shell:从1979起Unix就开始使用bourne shell,bourne shell的主文件名为sh。
2.C Shell:C Shell主要在BSD版的Unix系统中使用,其语法和C语言相类似而得名。
3.shell的两种主要语法类型有bourne和C,这两者语法彼此不兼容。

echo $SHELL 查看Shell
Bash:Bashsh兼容,现在使用的Linux就是使用Bash作为用户的基本Shell

Linux支持的shell 目录vi /etc/shells

1.3 shell的主要作用

帮助管理员简化管理linux系统的一种脚本语言,简化管理操作。没有像Java、PHP等语言复杂的功能。

二、脚本执行方式

2.1 echo输出命令

格式:echo [选项] [输出内容]

选项: -e:支持反斜线控制的字符转换

\a - 输出警告音
\b - 退格符
\n - 换行符
\r - 回车键
\t - 制表符,也就是tab键
\v - 垂直制表符
\0nnn - 按照八进制ASCII码输出字符
\xhh - 按照十六进制ASCII表输出字符

echo "bols he cangls ni xihuan nayige"
echo -e "bols he cangls nib xihuan nayige"
echo -e "hellbo"
echo -e "htetlnltot"
echo -e "x68tx65tx6cnx6ctx6f"
echo -e "e[1;31mShell基础e[0m"

输出颜色:

\e[1;xxm - 开启颜色显示; \e[0m - 关闭颜色显示

30m=黑色,31m=红色,32m=绿色,33m=黄色
34m=蓝色,35m=洋红,36m=青色,37m=白色

2.2 脚本执行

方法1:赋予执行权限,直接运行

chmod 755 hello.sh

./hello.sh(或者绝对路径执行 /root/hello.sh

方法2:通过Bash调用执行脚本

bash hello.sh

注解:#
第一行:#!/bin/Bash
不是注释,它标称下面的内容是Linux的标准脚本程序
如果该脚本使用纯shell语句完成,不加#!/bin/Bash,运行没问题
但,脚本调用了其他语言,就会报错。

三、Bash的基本功能

3.1 命令别名与快捷键

3.1.1 别名

alias:查看系统中所有的命令别名

alias ls = 'ls --color=never'

设定别名(临时生效,重启或重登录后失效)

alias 别名=‘原命令’(临时的)

永久生效
vi ~/.bashrc(不止一个环境变量文件) --写入环境变量配置文件(~代表用户家目录)
vi /root/.bashrc --增加alias ls = 'ls --color=never'(系统再次重启后永久生效)
source .bashrc--使当前环境变量设置生效(不需要系统再次重启后永久生效)

删除别名:
unalias ls

命令生效顺序

第一顺位执行绝对路径或者相对路径的命令
第二顺位执行别名
第三顺位执行Bash的内部命令
第四顺位执行按照$PATH环境变量设置定义的目录顺序的第一个命令

3.1.2 快捷键

ctrl + c 强制终止
ctrl + l 清屏相当于clear
ctrl + a 光标快速回到行首
ctrl + e 光标快速去到行尾
ctrl + u 从光标所在位置删除到行首
ctrl + z 把命令放入后台--这个命令很谨慎使用
ctrl + r 历史命令搜索

3.2 历史命令

历史命令指的是把操作过的命令保留在系统当中, 当需要的时候可以重新进行调用。

cat ~./history, 该文件下记录的命令是上次登录, 正确注销之后保存的。
history 命令查看, 不止有之前保存下来的, 还有本次登录后新操作的命令, 这些命令只有本次正确退出之后才会写入 ~./bash_history

history [选项] [历史命令保存文件]

选项:

-c : 清空历史命令
# 不建议清空原因1 : 当本次操作出现错误可用过历史命令进行比对排错
# 不建议清空原因2 : 当登录后发现历史命令被清空, 则可判断出有人登录过该账户或服务器
# 不建议清空原因3 : 即使命令保存数目众多, 文件大小也不大, 不会给服务器造成多大压力
-w : 把缓存中的历史命令强制写入历史命令保存文件 ~/.bash_history

历史命令默认保存1000条, 可以再环境变量配置文件 /etc/profile 中进行修改 (HISTSIZE)

历史命令的调用:

使用上、下箭头调用以前的历史命令
使用 "!n" 重复执行一次第 n 条历史命令
使用 "!!" 重复执行一次上一条命令
使用 "!字串" 重复执行一次最后一条以该字串开头的命令

执行service network restart后再输入!ser,就是执行同样命令。

命令与文本补全

  1. Bash中, 命令目录文件补全是非常方便与常用的功能, 我们只要在输入命令或文件时, 按"Tab"键就会自动进行补全。
  2. 系统进行命令补全是依赖 : $PATH

3.3 输出/入重定向

clipboard.png

3.3.1 输出重定向

clipboard.png

clipboard.png

关于2>&1的含义

  1. 含义:将标准错误输出重定向到标准输出
  2. 符号>&一个整体,不可分开,分开后就不是上述含义了。 比如有些人可能会这么想:2是标准错误输入,1是标准输出,>是重定向符号,那么”将标准错误输出重定向到标准输出”是不是就应该写成”2>1”就行了?是这样吗? 如果是尝试过,你就知道2>1的写法其实是将标准错误输出重定向到名为”1”的文件里去了
  3. 写成2&>1也是不可以的

Q&A : 每次都写”>log 2>&1”太麻烦,能简写吗?
有以下两种简写方式

1. &>log
2. >&log

上面两种方式都和”>log 2>&1”一个语义。
那么 上面两种方式中&>和>&有区别吗?
语义上是没有任何区别的,但是第一中方式是最佳选择,一般使用第一种

命令 &> /dev/null 将命令的结果丢入null(作用类似于垃圾箱)中 只执行,不显示.

3.3.2 输入重定向(用的少,了解即可)

wc [选项] [文件名]

选项:

-c:统计字节数
-w:统计单词数
-l:统计行数

wc < 文件名 用文件的内容作为输入
wc << 标识符
...
标识符 把标识符之间内容作为命令的输入

3.4 多命令执行符与管道符

clipboard.png

脚本中的应用:

命令 && echo yes || echo no 

命令正确yes 错误no

注意: && echo yes || echo no 顺序不能颠倒,不然命令出错的时候会同时输出no yes

分页显示文件内容:

more [文件名] 

管道符:

命令1 | 命令2

命令1正确的结果 作为命令2的操作对象。

例如

ls -l > /etc/ | more 用于分页显示命令执行结果
netstat -an | grep ESTABLISHED | wc -l 用于查看当前连接本机的客户端,并统计客户端数量
 

3.4通配符(文件名或者目录名)

1.?  匹配任意一个字符
2.*  匹配0个或任意多个字符
3.[] 匹配括号中任意一个字符
4.[-]匹配括号中任意一个字符,-代表一个范围
5.[^]匹配不是括号中任意一个字符

如:ls test*

Bash中其他特殊符号:

'' 单引号,在单引号中左右的特殊符号,如$,&都没有特殊含义
"" 双引号,在双引号中左右的特殊符号都没有特殊含义,但是“$”,"`","\"是例外。拥有“调用变量的值”,“引用命令”和“转义符”的特殊含义
`` 反引号,反引号括起来的内容是系统命令,在Bash中会先执行它。和$()作用一样。
$() 用来引用系统命令
# 在Shell脚本中,#开头的行代表注释
$ 用于调用变量的值,如需要调用变量name的值时,需要用$name的方式得到变量的值
\ 转义符,跟在\之后的特殊符号将失去特殊含义,变为普通字符。如\$将输出"$"符号  

Bohr
6.5k 声望3.3k 粉丝