目录
一、什么是shell
Shell
是一个用
C
语言编写的程序,它是用户使用
Linux
的桥梁。
Shell
既是一种命令语言,又是一种程
序设计语言。
shell
是解释执行的。
Shell
是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务
shell
的类型:
shell
有两种主要的语法类型:
Bourne
和
C
,这两种语法是互不兼容的。
Bourne
主要包括
sh
,
ksh
,
Bash
,
psh
,
zsh
,其中
Bash
在
linux
中使用最广;
C
家族主要包括:
csh
,
tcsh
。
# 查询系统中支持的 shell[lisen@localhost root] $ vi /etc/shells/bin/sh/bin/bash/usr/bin/sh/usr/bin/bash
二、shell入门
2.1 echo
echo
在
shell
编程中经常使用,可以将信息输出到终端,也可以将字符重定向到文件等。
echo
命令格式:
echo [
选项
] [
输出内容
]
选项
-e
表示支持反斜杠控制的字符转换
符号
|
作用
|
\
|
输出
\
本身
|
\a
|
输出警告声音
|
\b
|
退格键,即向左删除键
|
\c
|
取消输出行末的换行符,与
-n
作用一致
|
\e
|
esc
键
|
\f
|
换页符
|
\n
|
换行符
|
\r
|
回车符
|
\t
|
tab
键
|
\v
|
垂直制表符
|
\0nnn
|
按照
8
进制
ASCII
码表输出字符
|
\xhh
| 按照十六进制ASCII码表输出字符 |
示例:
[lisen@localhost root]$ echo -e "ab\bc"
ac[lisen@localhost root] $ echo -e "a\tb\tc\nd\te\tf"a b cd e f[lisen@localhost root] $ echo -e "\x61\t\x62\t\x63\n\x64\t\x65\t\x66"a b cd e f## \e[1 表示开启颜色输出, 31m 为定义颜色, \e[0m 表示结束颜色输出## 30m 黑色; 31m 红色; 32m 绿色; 33m 黄色; 34m 蓝色; 35m 洋红; 36m 青色; 37m 白色[root@localhost ~] # echo -e "\e[1;31m abcd \e[0m"abcd # 字体为红色
2.2 第一个脚本
[root@localhost ~]# mkdir sh
[root@localhost ~] # cd sh[root@localhost sh ] # vim hello.sh#!/bin/bash# hello.shecho "hello world"# 在执行前需要为脚本赋予可执行权限[root@localhost sh ] # ./hello.sh-bash : ./hello.sh: 权限不够[root@localhost sh ] # chmod 755 hello.sh[root@localhost sh ] # ./hello.shhello world
三、Bash的基本功能
3.1 别名
作用:
可以为我们常用的命令指定一个容易记的别名,方便使用。 在命令指定别名后,别名有优先执行
权
如何指定别名:
alias
别名
=‘
原命令
’
如果查看别名:
alias
示例:
[root@localhost ~]# alias vi='vim'[root@localhost ~]# aliasalias cp='cp -i'alias egrep='egrep --color=auto'alias fgrep='fgrep --color=auto'alias grep='grep --color=auto'alias l.='ls -d .* --color=auto'alias ll='ls -l --color=auto'alias ls='ls --color=auto'alias mv='mv -i'alias rm='rm -i'alias vi='vim'
关于命令的执行顺序:
如果使用绝对路径或相对路径执行命令,则执行是命令本身
如果没有指定相对或绝对命令,有别名优先执行别名
如果没有指定别名则,执行
Bash
的内部命令
优先级最后的是按照
$PATH
环境变量定义的目录查找顺序找到的第一个命令
注意: 原则上在定义别名时不要与原有的命令,这样容易混淆
别名的持久化:
以命令的方式定义的别名重启之后就不再有效了,如果需要持久化的保持别名在需要在
配置文件中指定。该文件在用户主目录下。
[root@localhost ~] # vi .bashrc# .bashrc# User specific aliases and functionsalias rm = 'rm -i'alias cp = 'cp -i'alias mv = 'mv -i'# 在下面定义自己的别名,该别名永久生效# Source global definitionsif [ -f /etc/bashrc ]; then. /etc/bashrcfi
3.2 常用快捷键
快捷键
|
作用
|
ctrl+c
| 强制终止当前命令 |
ctrl+L
| 清屏 |
ctrl+U
| 删除光标左侧的字符,同时将字符放入粘贴板,可以结合ctrl+Y进行粘贴 |
ctrl+K
| 删除光标右侧的字符,其作用与ctrl+U相同 |
ctrl+R
| 在历史命令中搜索命令 |
ctrl+D
| 退出当前终端 |
3.3 输入输出
标准输入输出:
设备
|
设备文件名
|
文件描述符
|
类型
|
键盘
| /dev/stdin | 0 | 标准输入 |
显示器
| /dev/sdtout | 1 | 标准输出 |
显示器
| /dev/sdterr | 2 | 标准错误输出 |
回收站
| /dev/null |
3.4 输出重定向
类型
|
符号
|
作用
|
标准输出重定向
|
命令
>
文件
|
以覆盖的方式,将命令的正确输出输出到指定的文件或
设备中
|
命令
>>
文件
|
以追加的方式,将命令的正确输出输出到指定的文件或
设备中
| |
标准错误输出重
定向
|
错误命令
2>
文
件
|
以覆盖的方式,把命令的错误输出输出到指定的文件或
设备中
|
错误命令
2>>
文件
|
以追加的方式,将命令的错误输出输出到指定的文件或
设备中
|
3.5 多命令执行
&&
|
例如:命令
1 &&
命令
2
, 表示命令
1
正确执行,则接着执行命令
2
;如果命令
1
没有执行则
命令
2
也不会执行
|
;
|
多个命令顺序执行,之间没有逻辑关系
|
示例:
# 如果 ls 命令正确执行,则会执行后一个命令ls /home/fafd && cd /home/fafd# 如果 ls /home/fafd 没有正确执行,则执行后一个命令ls /home/fafd || mkdir /home/fafd
3.6 管道符
命令格式:命令
1 |
命令
2
命令
1
的正确输出作为命令
2
的操作对象。注意:如果命令
1
不能正确输出则命令
2
不能执行。
示例:
# 当显示的结果比较多,则可以进行分屏显示ls /etc | more# 查看当前的连接[root@localhost ~] # netstat -an | grep ESTABLISHEDtcp 0 0 192 .168.114.128:22 192 .168.114.1:3293 ESTABLISHED
3.7 通配符和特殊符号
?
|
匹配任意一个字符
|
*
|
匹配
0
个或多个字符
|
[]
|
匹配中括号中的任意一个字符,例如:
[abc]
可以匹配
a
或
b
或
c
|
[-]
|
匹配中括号中的任意一个字符,
-
表示范围,例如:
[a-z]
,可以匹配从
a
到
z
中的任意一个字
符
|
[^]
|
是逻辑非,表示匹配不是中括号中的字符的其他字符,如:
[^a-z]
,表示匹配不是从
a
到
z
的
其他字符
|
‘’
单
引
号
|
单引号中,所有的特殊字符,如:
$, `
等,都只会当成是普通字符,即:失去了特殊符号
的作用
|
“” 双引号
|
双引号, 在双引号中特殊字符也会失去特殊含义,但是:
$, `
,
\
这几个特殊字符的特殊含
义是有作用的,分别是:获取变量的值,引用命令,转义符的意义
|
``
|
反引号,用来调用系统命令,在
Bash
中会运行,和
$()
作用一样
|
$()
|
和反引号一样,调用系统命令,建议使用这个,不容易看错
|
$
|
获取变量的值,如:
$name
|
\
|
转义字符,跟在其后的特殊字符会转换为普通字符,失去特殊含义
|
#
|
注释
|
示例:
[root@localhost ~] # name='zs'[root@localhost ~] # echo $namezs [root@localhost ~] # echo '$name'# 在单引号中失去了 $ 符号的特殊含义$name[root@localhost ~] # echo "$name"# 在双引号中 $ 没有失去特殊含义zs[root@localhost ~] #[root@localhost ~] # d=`date`# 将 date 命令的结果赋给变量 d[root@localhost ~] # echo $d2021 年 11 月 14 日 星期日 13 :01:38 CST[root@localhost ~] # dd=$(date)# 将 date 命令的结果赋给变量 d[root@localhost ~] # echo $dd2021 年 11 月 14 日 星期日 13 :01:58 CST