第8章 Shell基础

📝 Linux学习笔记 - 第8章 🎯 共6节


本章目录


Shell概述

返回目录 | 返回顶部

什么是Shell

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

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

Shell的分类

  • Bourne Shell:主文件名为sh
  • C Shell:BSD版本的Shell,语法类似C语言

Bourne家族:

  • Bourne Shell(sh)
  • Korn Shell(ksh)
  • Bourne Again Shell(bash)
  • POSIX Shell(sh)

C家族:

  • C Shell(csh)
  • tcsh

Linux的标准Shell是bash

Linux支持的Shell

cat /etc/shells
# 查看系统支持的Shell

可以直接输入Shell名称切换:

sh
csh
zsh
# 等等

Shell脚本的执行方式

返回目录 | 返回顶部

echo输出命令

echo [选项] [输出内容]
选项说明
-e支持反斜线控制的字符转换

控制字符:

控制字符作用
\输出\本身
\a输出警告音
\b退格键,也就是向左删除键
\c取消输出行末的换行符。和”-n”选项一致
\eESCAPE键
\f换页符
\n换行符
\r回车键
\t制表符,也就是Tab键
\v垂直制表符
\0nnn按照八进制ASCII码表输出字符。其中0为数字零,nnn是三位八进制数
\xhh按照十六进制ASCII码表输出字符。其中hh是两位十六进制数

示例:

echo -e "a\tb\tc\nd\te\tf"
# 输出带制表符和换行的内容
 
echo -e "\e[1;31m 红色文字 \e[0m"
# 输出带颜色的文字
# 30m=黑色 31m=红色 32m=绿色 33m=黄色
# 34m=蓝色 35m=洋红 36m=青色 37m=白色

第一个脚本

#!/bin/bash
# 第一个脚本
echo -e "\e[1;34m 天上掉下个林妹妹 \e[0m"

脚本执行

方式一:赋予执行权限,直接运行

chmod 755 hello.sh
./hello.sh

方式二:通过Bash调用执行脚本

bash hello.sh

Bash的基本功能

返回目录 | 返回顶部

历史命令

history [选项] [历史命令保存文件]
选项说明
-c清空历史命令
-w把缓存中的历史命令写入历史命令保存文件~/.bash_history

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

实际历史命令保存的位置为: /root/.bash_history

历史命令的调用

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

命令与文件补全

在Bash中,命令与文件补全是非常方便与常用的功能,我们只要在输入命令或文件时,按”Tab”键就会自动进行补全。

命令别名

alias 别名='原命令'
# 设定命令别名
 
alias
# 查询命令别名

命令执行时顺序

  1. 第一顺位执行用绝对路径或相对路径执行的命令
  2. 第二顺位执行别名
  3. 第三顺位执行Bash的内部命令
  4. 第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令

让别名永久生效

vi /root/.bashrc

删除别名

unalias 别名

Bash常用快捷键

快捷键作用
ctrl+A把光标移动到命令行开头
ctrl+E把光标移动到命令行结尾
ctrl+C强制终止当前的命令
ctrl+L清屏,相当于clear命令
ctrl+U删除或剪切光标之前的命令
ctrl+K删除或剪切光标之后的内容
ctrl+Y粘贴ctrl+U或ctrl+K剪切的内容
ctrl+R在历史命令中搜索
ctrl+D退出当前终端
ctrl+Z暂停,并放入后台
ctrl+S暂停屏幕输出
ctrl+Q恢复屏幕输出

标准输入输出

设备设备文件名文件描述符类型
键盘/dev/stdin0标准输入
显示器/dev/stdout1标准输出
显示器/dev/stderr2标准错误输出

输出重定向

类型符号(格式)作用
标准输出重定向命令 > 文件以覆盖的方式,把命令的正确输出输出到指定的文件或设备当中
命令 >> 文件以追加的方式,把命令的正确输出输出到指定的文件或设备当中
标准错误输出重定向错误命令 2> 文件以覆盖的方式,把命令的错误输出输出到指定的文件或设备当中
错误命令 2>> 文件以追加的方式,把命令的错误输出输出到指定的文件或设备当中
正确输出和错误输出同时保存命令 > 文件 2>&1以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中
命令 >> 文件 2>&1以追加的方式,把正确输出和错误输出都保存到同一个文件当中
命令 &> 文件以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中
命令 &>> 文件以追加的方式,把正确输出和错误输出都保存到同一个文件当中
命令 >> 文件1 2>> 文件2把正确的输出追加到文件1中,把错误的输出追加到文件2中
ls &>/etc/null
# 把输出结果指向null,相当于垃圾箱,不存在的黑洞

输入重定向

wc [选项] [文件名]
选项说明
-c统计字节数
-w统计单词数
-l统计行数
wc << hello
# 在输入的内容中遇到hello时才会结束并统计结果

多命令顺序执行

多命令执行符格式作用
;命令1;命令2多个命令顺序执行,命令之间没有任何逻辑联系
&&命令1&&命令2逻辑与:当命令1正确执行,则命令2才会执行;当命令1执行不正确,则命令2不会执行
||命令1||命令2逻辑或:当命令1执行不正确,则命令2才会执行;当命令1正确执行,则命令2不会执行

示例:

ls ; date ; cd /user ; pwd
 
dd if=输入文件 of=输出文件 bs=字节数 count=个数
选项说明
if=输入文件指定源文件或源设备
of=输出文件指定目标文件或目标设备
bs=字节数指定一次输入/输出多少字节,即把这些字节看做一个数据块
count=个数指定输入/输出多少个数据块
date ; dd if=/dev/zero of=/root/testfile bs=1k count=100000 ; date
# 拷贝指定大小的文件,用两个日期时间来判断所用的时间
 
ls anaconda-ks.cfg && echo yes
# 当ls命令正确执行后输出yes,错误则不输出
 
ls /root/test || echo "no"
# 当ls命令错误执行后输出no,正确执行则不输出
 
命令 && echo yes || echo no
# 当命令正确执行后输出yes,当echo yes没有正确执行则输出no

管道符

命令格式:

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

示例:

ll -a /etc/ | more
# 用 ll (ls -l) 以分页模式显示/etc/下所有的文件
 
netstat -an | grep "ESTABLISHED"
# 显示网络状态中包含"ESTABLISHED"的字段

grep命令:

grep [选项] "搜索内容" 文件名
选项说明
-i忽略大小写
-n输出行号
-v反向查找
—color=auto搜索出的关键字用颜色显示

通配符

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

示例:

cd /tmp/
rm -rf *
# 删除/tmp/下所有文件
 
touch abc
touch abcd
touch 012
touch 0abc
 
ls ?abc
# 匹配?abc,?必须匹配一个字符
# 输出:0abc
 
ls [0-9]*
# 匹配包含一个0-9数字开头的任何文件
# 输出:012 0abc
 
ls [^0-9]*
# 匹配不含数字开头的任何文件
# 输出:abc abcd

Bash中其他特殊符号

符号作用
单引号。在单引号中所有的特殊符号,如”$“和”`“(反引号)都没有特殊含义
""双引号。在双引号中特殊符号都没有特殊含义,但是”$”、”`“和""是例外
反引号。反引号括起来的内容是系统命令,在Bash中会先执行它
$()和反引号作用一样,用来引用系统命令
#在Shell脚本中,#开头的行代表注释
$用于调用变量的值
\转义符,跟在\之后的特殊符号将失去特殊含义

单引号与双引号

name=sc
echo '$name'
# 输出:$name
 
echo "$name"
# 输出:sc
 
echo '$(date)'
# 输出:$(date)
 
echo "$(date)"
# 输出:当前日期时间

反引号与$()

echo `ls`
# 输出ls命令结果,相当于执行ls
 
echo $(date)
# 输出date命令,相当于执行date
# 推荐使用$(),因为反引号非常容易看错

Bash的变量

返回目录 | 返回顶部

用户自定义变量

什么是变量

变量是计算机内存的单元,其中存放的值可以改变。当Shell脚本需要保存一些信息时,如一个文件名或是一个数字,就把它存放在一个变量中。每个变量有一个名字,所以很容易引用它。

变量设置规则

  • 变量名称可以由字母、数字和下划线组成,但是不能以数字开头
  • 在Bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必须指定变量类型为数值型
  • 变量用等号连接值,等号左右两侧不能有空格
  • 变量的值如果有空格,需要使用单引号或双引号包括
  • 在变量的值中,可以使用""转义符
  • 如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含”{变量名}包含
  • 如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令
  • 环境变量名建议大写,便于区分

变量分类

  • 用户自定义变量
  • 环境变量:这种变量中主要保存的是和系统操作环境相关的数据
  • 位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的
  • 预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的

本地变量

name="shen chao"
# 定义变量
 
echo $name
# 调用变量

变量叠加:

aa=123
aa="$aa"456
# 或者
aa=${aa}789

变量查看:

set
# 查询系统中所有变量

变量删除:

unset 变量名
# 删除变量

环境变量

什么是环境变量

用户自定义变量只在当前的Shell中生效,而环境变量会在当前Shell和这个Shell的所有子Shell当中生效。如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的Shell中生效。

设置环境变量

export 变量名=变量值
# 声明环境变量
 
env
# 查询环境变量
 
unset 变量名
# 删除变量

系统常见环境变量

  • PATH:系统查找命令的路径
echo $PATH
# 查看PATH环境变量
 
PATH="$PATH":/root/sh
# 变量叠加
  • PS1:定义系统提示符的变量
代码说明
\d显示日期,格式为”星期 月 日”
\h显示简写主机名。如默认主机名”localhost”
\t显示24小时制时间,格式为”HH:MM:SS”
\T显示12小时制时间,格式为”HH:MM:SS”
\A显示24小时制时间,格式为”HH:MM”
\u显示当前用户名
\w显示当前所在目录的完整名称
\W显示当前所在目录的最后一个目录
#执行的第几个命令
$提示符。如果是root用户会显示提示符为”#“,如果是普通用户会显示提示符为”$“

位置参数变量

位置参数变量作用
$nn为数字,1-{10}
$*这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
$@这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待
$#这个变量代表命令行中所有参数的个数

示例:

#!/bin/bash
echo $0
echo $1
echo $2
echo $3

预定义变量

预定义变量作用
$?最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0,则证明上一个命令执行不正确了
$$当前进程的进程号(PID)
$!后台运行的最后一个进程的进程号(PID)

接收键盘输入

read [选项] [变量名]
选项说明
-p “提示信息”在等待read输入时,输出提示信息
-t 秒数read命令会一直等待用户输入,使用此选项可以指定等待时间
-n 字符数read命令只接受指定的字符数,就会执行
-s隐藏输入的数据,适用于机密信息的输入

示例:

#!/bin/bash
read -t 30 -p "请输入你的姓名:" name
echo $name
 
read -s -t 30 -p "请输入你的年龄:" age
echo -e "\n"
echo $age
 
read -n 1 -t 30 -p "请输入你的性别[M/F]:" gender
echo -e "\n"
echo $gender

Bash的运算符

返回目录 | 返回顶部

数值运算的方法

declare声明变量类型

declare [+/-][选项] 变量名
选项说明
-给变量设定类型属性
+取消变量的类型属性
-a将变量声明为数组型
-i将变量声明为整数型(integer)
-r将变量声明为只读变量。注意,一旦设置为只读变量,既不能修改变量的值,也不能删除变量,甚至不能通过+r取消只读属性
-x将变量声明为环境变量
-p显示指定变量的被声明的类型

示例:数值运算

aa=11
bb=22
declare -i cc=$aa+$bb
echo $cc

expr或let数值运算工具

aa=11
bb=22
cc=$(expr $aa + $bb)
# cc的值是aa和bb的和
# 注意:"+"号左右两侧必须有空格

[运算式]“

aa=11
bb=22
cc=$(( $aa + $bb ))
# 或者
dd=$[ $aa + $bb ]

运算符

优先级运算符说明
13-, +单目负、单目正
12!, ~逻辑非、按位取反或补码
11*, /, %乘、除、取模
10+, -加、减
9<<, >>按位左移、按位右移
8, >=, <, >小于或等于、大于或等于、小于、大于
7==, !=等于、不等于
6&按位与
5^按位异或
4|按位或
3&&逻辑与
2||逻辑或
1=, +=, -=, *=, /=, %=, &=, ^=, |=, <, >>=赋值、运算且赋值

示例:

#!/bin/bash
echo $(( (11+22)*3/2 ))

变量测试与内容替换

变量置换方式变量y没有设置变量y为空值变量y设置值
x=${y-新值}x=新值x为空x=$y
x=${y:-新值}x=新值x=新值x=$y
x=${y+新值}x为空x=新值x=新值
x=${y:+新值}x为空x为空x=新值
x=${y=新值}x=新值 y=新值x为空 y值不变x=$y y值不变
x=${y:=新值}x=新值 y=新值x=新值 y=新值x=$y y值不变
x=${y?新值}新值输出到标准错误(就是屏幕)x为空x=$y
x=${y:?新值}新值输出到标准错误新值输出到标准错误x=$y

环境变量配置文件

返回目录 | 返回顶部

环境变量配置文件简介

环境变量配置文件的功能

系统中有些环境变量如PATH、HISTSIZE、PS1、HOSTNAME等,这些变量是系统启动时就自动加载的,因为它们写入了环境变量配置文件中。

配置文件的生效顺序

环境变量配置文件有好几个,它们有一个生效顺序,我们先看一下这些配置文件的作用。

环境变量配置文件

/etc/profile

系统级别的环境变量配置文件,对所有用户都生效。

主要修改的变量:

  • USER
  • LOGNAME
  • MAIL
  • PATH
  • HOSTNAME
  • HISTSIZE
  • umask

/etc/bashrc

系统级别的bash配置文件,对所有用户都生效。

主要修改的变量:

  • PS1
  • umask
  • PATH

~/.bash_profile

用户级别的环境变量配置文件,只对当前用户生效。

~/.bashrc

用户级别的bash配置文件,只对当前用户生效。

~/.bash_logout

用户注销时执行的配置文件。

~/.bash_history

历史命令保存文件。

配置文件加载顺序

登录Shell时的加载顺序:

  1. /etc/profile
  2. ~/.bash_profile
  3. ~/.bashrc
  4. /etc/bashrc

注意:/.bash_profile会调用/.bashrc,而~/.bashrc会调用/etc/bashrc

其他配置文件和登录信息

注销时生效的环境变量配置文件

~/.bash_logout

历史命令

~/.bash_history

Shell登录信息

本地终端欢迎信息:/etc/issue

转义符作用
\d显示当前系统日期
\s显示操作系统名称
\l显示登录的终端号,这个比较常用
\m显示硬件体系结构,如i386、i686等
\n显示主机名
\o显示域名
\r显示内核版本
\t显示当前系统时间
\u显示当前登录用户的序列号

远程终端欢迎信息:/etc/issue.net

  • 转义符在/etc/issue.net文件中不能使用
  • 是否显示此欢迎信息,由ssh的配置文件/etc/ssh/sshd_config决定,加入”Banner /etc/issue.net”行才能显示(记得重启SSH服务)

登录后欢迎信息:/etc/motd

不管是本地登录,还是远程登录,都可以显示此欢迎信息。