Linux 笔记分享四:Shell 基础

一、Shell概述

1、Shell是什么

Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序

Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强。Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令

Shell将英文字符转换成二进制,依据ASCII字码表

2、Shell的分类

  • Bourne Shell

Bourne Shell: 从1979年起Unix就开始使用Bourne Shell,Bourne Shell的主文件名为sh

此Shell版本比较老,不支持历史命令

Linux现使用的是此版本的升级版

  • C Shell

C Shell主要在BSD版的Unix系统中使用,其语法和C语言类似而得名

  • 分类总结

Shell的两种主要语法类型有Bourne和C,这两种语法彼此不兼容

Bourne家族主要包括sh、ksh、Bash(linux现用)、psh、zsh

C家族主要包括csh、tcsh

  • 查看Linux当前运行的Shell
echo $SHELL

返回:

/bin/bash
  • 关于Bash

Bash与sh兼容,现在使用的Linux就是使用Bash作为用户的基本Shell

  • 查看Bash兼容的shell
vi /etc/shells
  • 进入sh版本的Shell
sh

一般安全模式下进入的是此版本的Shell

  • 进入csh版本的Shell
csh
  • 退出到上一个版本的Shell
exit
  • 关于进入Shell的说法

初始登录系统进入的Shell叫父Shell,当进入某一Shell叫进入子Shell

二、脚本执行方式

1、echo

输出字符串命令

echo [选项] [字符串]

-e: 支持反斜杠控制的字符转义

  • 转义列表
字符 含义
\a 输出警告音
\b 退格键,也就是向左删除键
\n 换行符
\r 回车键
\t 制表符,也就是Tab键
\v 垂直制表符
\0八进制代码 按照ASCII的八进制输出对应字符
\x十六进制代码 按照ASCII的十六进制输出对应字符

例如:

echo -e "hell\bo"
echo -e "h\te\tl\nl\to\t"
echo -e "\x68\t\x65\t\x6c\n\x6c\t\x6f"
  • 颜色支持
echo -e "\e[1;31m字符串\e[0m"

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

  • 我的第一个Shell脚本
#!/bin/bash
#我的第一个Shell脚本

echo -e "\e[1;34mHello World\e[0m"

将其保存为hello.sh

  • 运行脚本

赋予权限,直接执行(常用)

chmod 755 hello.sh

通过Bash调用执行脚本

bash hello.sh

三、Bash的基本功能

1、命令别名

  • 查看系统中所有的命令别名
alias
  • 设定别名
alias 别名='原命令'

其实,以上设置别名的格式与alias查看的别名格式一样

cp、mv、rm默认执行是带-i的,目的是起到询问作用,防止误操作

注意,这样设定的别名是临时生效,重启后失效,关于永久生效请继续阅读

  • 关于vi

vim是vi的增强版本,vim支持颜色

  • 关于别名永久生效
vim ~/.bashrc

然后:

source ~/.bashrc

打开家目录中的别名环境变量配置文件

将别名配置写入保存

  • 删除别名
unalias 别名

临时删除,如果配置文件还有配置,则重启重新生效

  • 关于命令的优先级

以下从优先级最高到最低排序

1、通过绝对路径或相对路径执行的命令
2、执行别名
3、执行Bash的内部命令
4、通过$PATH环境变量定义的目录查找顺序找到的第一个命令
  • 关于ls显示的颜色问题

目录一般是蓝色

可执行文件一般是绿色

普通文件没有颜色

2、常用快捷键

ctrl+c: 强制终止当前命令

ctrl+l: 清屏

ctrl+a: 光标移动到命令行首

ctrl+e: 光标移动到命令行尾

ctrl+u: 从光标所在位置删除到行首

ctrl+z: 把命令放入后台

ctrl+r: 在历史命令中搜索

  • 清屏命令
clear

等同于快捷键

3、历史命令

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

没有选项,是查看当前缓存的历史命令

-c: 清空历史命令(不建议这样干)

-w: 把历史命令缓存保存到文件中,后面需要历史命令保存文件路径

每次退出,历史命令缓存将自动保存为文件

每次登陆,会读取保存的历史命令文件放入缓存中

历史命令默认为1000条,关于修改,请继续阅读

  • 修改默认历史命令数量
vim /etc/profile

然后修改:

HISTSIZE=1000

即可

  • 历史命令的调用方式

使用上下箭头调用

使用!n调用编号为n的历史命令

使用!!调用最后执行的一条命令

使用!字符串调用最后执行以字符串开头的命令

4、Tab键

提供命令补全和目录补全

命令补全依靠PATH变量,目录补全依靠你的目录

要养成按Tab键的习惯,它可以提高输入速度,并能检测你的命令是否有错误

5、输入和输出重定向

  • 标准输入输出
设备 设备文件名 文件描述符 类型
键盘 /dev/stdin 0 标准输入
显示器 /dev/sdtout 1 标准输出
显示器 /dev/sdterr 2 标准错误输出
  • 输出重定向

file

  • 正确和错误信息同时保存
命令 作用
命令 > 文件 2>&1 已覆盖的方式,把正确输出和错误输出都保存到同一个文件中
命令 >> 文件 2>&1 已追加的方式,把正确输出和错误输出都保存到同一个文件中
命令 &> 文件 已覆盖的方式,把正确输出和错误输出都保存到同一个文件中
命令 &>> 文件 已追加的方式,把正确输出和错误输出都保存到同一个文件中
命令 >> 文件 2>> 另一个文件 把正确输出和错误输出保存到不同的文件中
  • /dev/null

这个文件是系统的黑洞,输出信息写入这里面就没啦

  • 输入重定向(了解一下就可以了)
命令 < 文件把文件作为命令的输入
命令 << 标识符
... ...
标识符
  • wc
wc [选项] [<] [文件名]

-c: 统计字节数

-w: 统计单词数

-l: 统计行数

以上<可有可无,会统计文件名的行数、单词数、字符数

wc

手动输入字符,按ctrl+d统计输入字符的行数、单词数、字符数

wc << 标识符
...
标识符

手动输入字符,统计输入字符的行数、单词数、字符数

6、管道符

  • 多命令顺序执行
多命令执行符 格式 作用
; 命令1;命令2 多个命令顺序执行,命令之间没有任何逻辑联系
&& 命令1&&命令2 逻辑与
当命令1正确执行,则命令2才会执行
当命令1执行不正确,则命令2不会执行
|| 命令1||命令2 逻辑或
当命令1执行不正确,则命令2才会执行
当命令1正确执行,则命令2不会执行
  • 一个判断命令是否正确执行的做法
ls && echo yes || echo no
  • 管道符
命令1 | 命令2

命令1的正确输出作为命令2的操作对象

  • 管道符使用示例
ll /etc | more

more 文件名 分屏显示

上面的意思是将ll的结果给more执行,即分屏显示ll的结果

netstat -an | grep :80

以上是常用的端口查看工具

netstat -an | grep ESTABLISHED | wc -l

如果有一行,代表有一个连接(这是双管道符嵌套)

7、通配符

通配符 作用
? 匹配一个任意字符
* 匹配0个或任意多个任意字符,也就是可以匹配任何内容
[] 匹配中括号中任意一个字符。例如: [abc]代表一定匹配一个字符,或者a,或者b,或者c
[-] 匹配中括号中任意一个字符,-代表一个范围。例如: [a-z]代表匹配一个小写字母
[^] 逻辑非,表示匹配不是中括号内的一个字符。例如: [^0-9]代表匹配一个不是数字的字符

ls支持通配符列出

  • Bash中其他特殊字符
符号 作用
'' 单引号。在单引号中所有的特殊符号,如“$”何“`”(反引号)都没有特殊含义
"" 双引号。在双引号中所有的特殊符号除了后面说的都没有特殊含义,但是“$”、“`”和“\”是例外,拥有“调用变量的值”、“引用命令”、和“转义符”的特殊含义
`` 反引号。反引号括起来的内容是系统命令,在Bash中会先执行它。和$()作用一样,不过推荐$(),因为反引号容易看错
$() 和反引号一样,用来引用系统命令
# 在Shell脚本,起到注释作用
$ 用于调用变量的值,如需要调用变量name的值时,需要用$name的方式得到变量的值
\|转义符,跟在\后面的特殊符号将失去作用,变为普通字符,如\$将输出“$”符号,而不当做变量引用

Bash中变量与PHP中的变量的区别是赋值不需要“$”,取值需要“$”

本作品采用《CC 协议》,转载必须注明作者和本文链接
时空扭曲, 到底长啥样.
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!