目录
1 Shell概述
1.1 Shell是什么
-
Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
-
Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强。
-
Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令。
1.2 Shell的分类
-
Bourne Shell:从1979起Unix就开始使用Bourne Shell,Bourne Shell的主文件名为sh。
-
C Shell: C Shell主要在BSD版的Unix系统中使用,其语法和C语言相类似而得名
-
Shell的两种主要语法类型有Bourne和C,这两种语法彼此不兼容。Bourne家族主要包括sh、ksh、Bash、psh、zsh;C家族主要包括:csh、tcsh
-
Bash: Bash与sh兼容,现在使用的Linux 就是使用Bash作为用户的基本Shell。
1.3 Linux支持的Shell
通过命令 cat /etc/shells 查看
2 Shell脚本的执行方式
2.1 echo输出命令
命令格式:echo [选项] [输出内容]
选项:
- -e: 支持反斜线控制的字符转换
常用命令
echo -e "ab\bc" # 删除左侧字符
echo -e "a\tb\tc\nd\te\tf" # 制表符与换行符
echo -e "\x61\t\x62\t\x63\n\x64\t\x65\t\x66" # 按照十六进制ASCII码也同样可以输出
echo -e "\e[1;31m abcd \e[0m" # 输出颜色
#30m=黑色,31m=红色,32m=绿色,33m=黄色
#34m=蓝色,35m=洋红,36m=青色,37m=白色
2.2 第一个脚本
vi hello.sh
#!/bin/bash
#The first program
# Author: apollo_miracle
echo "hello, World."
2.3 脚本执行
-
赋予执行权限,直接运行
-
chmod 755 hello.sh
-
./hello.sh
-
-
通过Bash调用执行脚本
-
bash hello.sh
-
sh hello.sh
-
2.4 俄罗斯方块游戏
源码下载:shell_bash_俄罗斯方块游戏
小贴士:
如果是在Windows系统中开发的流程,放在Linux系统中可能无法执行。
可以使用命令 fromdos ./els.sh 进行格式修改,同理,也可以使用命令 todos ./els.sh 将unix命令改为dos命令。(ubuntu系统要先安装tofrodos,yum -y install tofrodos)
其他系统命令为unix2dos和dos2unix两个命令
3 Bash的基本功能
3.1 历史命令
3.1.1 历史命令格式
命令格式:history [选项] [历史命令保存文件]
选项:
- -c: 清空历史命令
- -w: 把缓存中的历史命令写入历史命令保存文件
小贴士:
- 历史命令保存在家目录的.bash_history 文件中:~/.bash_history
历史命令默认会保存1000条,可以在环境变量配置文件/etc/profile中进行修改
3.1.2 历史命令的调用
使用上、下箭头调用以前的历史命令
使用“!n”重复执行第n条历史命令
使用“!!”重复执行上一条命令
使用“!字串”重复执行最后一条以该字串开头的命令
3.2 命令补全
在Bash中,命令与文件补全是非常方便与常用的功能,我们只要在输入命令或文件时,按“Tab”键就会自动进行补全
3.3 命令别名
3.3.1 设定别名
命令格式:alias 别名='原命令'
常用命令
alias vi='vim' # 设定命令别名
alias # 查询命令别名
命令执行时顺序
1 第一顺位执行用绝对路径或相对路径执行的命令。
2 第二顺位执行别名。
3 第三顺位执行Bash的内部命令。
4 第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令。
3.3.2 让别名永久生效
在家目录下的.bashrc文件中添加即可。
vim /root/.bashrc
3.3.3 删除别名
命令格式:unalias 别名
3.4 常用快捷键
Bash常用快捷键
小贴士:
其中标记的为重点快捷键,需要熟练使用
注意:ctrl+z 快捷键一定要谨慎使用,如果使用的多了,系统会占用大量存储空间来存放暂停的数据,用多了系统会变卡!!!
3.5 输入输出重定向
3.5.1 标准输入输出
3.5.2 输出重定向
小贴士:
- 以上命令不太常用,常用的命令是下边的命令
- 在输入报错文件中 2和>必选连着写,不能有空格
小贴士:
命令 >> 文件 2>&1 ,命令 &>>文件 两种保存都一样,只不过是格式不同
特殊用法:
命令 &>/dev/unll 不管命令是否正确,直接丢入这个文件夹,不保存任何数据,在写shell脚本时有用
3.5.3 输入重定向
不通过键盘输入,通过文件输入,在实际中用的不多,用在给源码包打补丁
命令格式:wc [选项] [文件名]
选项:
- - c 统计字节数
- - w 统计单词数
- - l 统计行数
用法:
统计内容行数、单词数、字节数。
命令 < 文件 把文件作为命令的输入
命令 << 标识符 一直输入,直到输入标识停止输入把标识符之间内容作为命令的输入
3.6 多命令顺序执行
常用命令
ls ; date ; cd /user ; pwd # 顺序执行这些命令
date ; dd if=/dev/zero of=/root/testfile bs=1k count=100000 ; date # 计算执行中间命令需要的时间
ls && echo yes # 命令执行成功之后返回yes
ls /user || echo no # 命令执行失败之后返回no
命令 && echo yes || echo no # 判断命令执行情况
小贴士:磁盘文件复制
dd if=输入文件 of=输出文件 bs=字节数 count=个数
- if=输入文件 指定源文件或源设备
- of=输出文件 指定目标文件或目标设备
- bs=字节数 指定一次输入/输出多少字节,即把这些字节看做 一个数据块
- count=个数 指定输入/输出多少个数据块
这条命令可以把系统文件,磁盘都复制了,非常强大
3.7 管道符
命令格式:命令1 | 命令2
#命令1的正确输出作为命令2的操作对象
常用命令
ll -a /etc/ | more
netstat -an | grep "ESTABLISHED"
grep [选项] “搜索内容” 文件名
- -i: 忽略大小写
- -n: 输出行号
- -v: 反向查找
- –color=auto 搜索出的关键字用颜色显示
3.8 通配符
3.9 Bash中其他特殊符号
常用命令
反引号与$()
echo `ls`
echo $(date)
单引号与双引号
name=apollo
echo '$name'
echo "$name"
echo '$(date)'
echo "$(date)"
4 Bash的变量
4.1 用户自定义变量
4.1.1 什么是变量
变量是计算机内存的单元,其中存放的值可以改变。当Shell脚本需要保存一些信息时,如一个文件名或是一个数字,就把它存放在一个变量中。每个变量有一个名字,所以很容易引用它。使用变量可以保存有用信息,使系统获知用户相关设置,变量也可以用于保存暂时信息。
4.1.2 变量设置规则
-
变量名称可以由字母、数字和下划线组成,但是不能以数字开头。如果变量名是“2name”则是错误的。
-
在Bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必修指定变量类型为数值型。
-
变量用等号连接值,等号左右两侧不能有空格。
-
变量的值如果有空格,需要使用单引号或双引号包括。
-
在变量的值中,可以使用“\”转义符。
-
如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含“$变量名”或用${变量名}包含。
-
如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令。
-
环境变量名建议大写,便于区分。
4.2 变量分类
-
用户自定义变量
-
环境变量:这种变量中主要保存的是和系统操作环境相关的数据。
-
位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。
-
预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。
4.2.1 本地变量(用户自定义变量)
-
变量定义
name="apollo miracle"
-
变量叠加
aa=123
aa="$aa"456
aa=${aa}789
-
变量调用
echo $name
-
变量查看(查看当前系统全部变量)
set
-
变量删除
unset name
4.2.2 环境变量
用户自定义变量只在当前的Shell中生效,而环境变量会在当前Shell和这个Shell的所有子Shell当中生效。如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的Shell中生效。
小贴士:pstree是以树结构显示进程(–display a tree of processes)
提示:-bash: pstree: 未找到命令,那么root身份执行 yum install psmisc
- 设置环境变量
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用户会显示提示符为“#”,如果是普通用户会显示提示符为“$”
PS1='[\u@\t \w]\$ ' PS1='[\u@\@ \h \# \W]\$ ' PS1='[\u@\h \W]\$ '
4.2.3 位置参数变量
案例1:
#!/bin/bash
echo $0
echo $1
echo $2
echo $3
echo $4
echo $5
案例2:
#!/bin/bash
num1=$1
num2=$2
sum=$(( $num1 + $num2))
#变量sum的和是num1加num2
echo "$num1 + $num2 = $sum"
#打印变量sum的值
案例3:
#!/bin/bash
echo "A total of $# parameters"
#使用$#代表所有参数的个数
echo "The parameters is: $*"
#使用$*代表所有的参数
echo "The parameters is: $@"
#使用$@也代表所有参数
案例4:$*与$@的区别
#!/bin/bash
for i in "$*"
#$*中的所有参数看成是一个整体,所以这个for循环只会循环一次
do
echo "The parameters is: $i"
done
x=1
for y in "$@"
#$@中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次
do
echo "The parameter$x is: $y"
x=$(( $x +1 ))
done
4.2.4 预定义变量
案例:
#/bin/bash
# Author: Apollo
echo "The current process is $$"
#输出当前进程的PID。
#这个PID就是variable.sh这个脚本执行时,生成的进程的PID
find /root -name hello.sh &
#使用find命令在root目录下查找hello.sh文件
#符号&的意思是把命令放入后台执行
echo "The last one Daemon process is $!"
接收键盘输入:read [选项] [变量名]
选项:
- -p “提示信息”:在等待read输入时,输出提示信息
- -t 秒数: read命令会一直等待用户输入,使用此选项可以指定等待时间
- -n 字符数: read命令只接受指定的字符数,就会 执行
- -s: 隐藏输入的数据,适用于机密信息的输入
案例:
#!/bin/bash
#Author: Apollo
read -t 30 -p "Please input your name: " name
#提示“请输入姓名”并等待30秒,把用户的输入保存入变量name中
echo "Name is $name "
read -s -t 30 -p "Please enter your age: " age
#年龄是隐私,所以我们用“-s”选项隐藏输入
echo -e "\n"
echo "Age is $age "
read -n 1 -t 30 -p "Please select your gender[M/F]: " gender
#使用“-n 1”选项只接收一个输入字符就会执行(都不用输入回车)
echo -e "\n"
echo "Sex is $gender"
5 Bash的运算符
5.1 数值运算与运算符
5.1.1 declare声明变量类型
命令格式:declare [+/-][选项] 变量名
选项:
- -: 给变量设定类型属性
- +: 取消变量的类型属性
- -i: 将变量声明为整数型(integer)
- -x: 将变量声明为环境变量
- -p: 显示指定变量的被声明的类型
5.1.2 数值运算
方法1:
方法2:expr或let数值运算工具
注意:“+”号左右两侧必须有空格
方法3:“$((运算式))”或“$[运算式]” (推荐)
5.1.3 运算符
[root@localhost ~]$ aa=$(( (11+3)*3/2 ))
#虽然乘和除的优先级高于加,但是通过小括号可以调整运算优先级
[root@localhost ~]$ bb=$(( 14%3 ))
#14不能被3整除,余数是2
[root@localhost ~]$ cc=$(( 1 && 0 ))
#逻辑与运算只有想与的两边都是1,与的结果才是1,否则与的结果是0
aa=$(( (11+3)*3/2 ))
#虽然乘和除的优先级高于加,但是通过小括号可以调整运算优先级
bb=$(( 14%3 ))
#14不能被3整除,余数是2
cc=$(( 1 && 0 ))
#逻辑与运算只有与的两边都是1,与的结果才是1,否则与的结果是0dd=$(( 1 || 0 ))
#逻辑或运算只有或的两边都是0,或的结果才是0,否则或的结果是1
5.2 变量测试与内容替换
案例:
[root@localhost ~]# unset y
#删除变量y
[root@localhost ~]# x=${y-new}
#进行测试
[root@localhost ~]# echo $x
new
#因为变量y不存在,所以x=new
[root@localhost ~]# y=""
#给变量y赋值为空
[root@localhost ~]# x=${y-new}
#进行测试
[root@localhost ~]# echo $x
[root@localhost ~]# y=old
#给变量y赋值
[root@localhost ~]# x=${y-new}
#进行测试
[root@localhost ~]# echo $x
old
6 环境变量配置文件
6.1 环境变量配置文件简介
6.1.1 source命令
source 配置文件
或
. 配置文件 # 点(.)与配置文件之间有空格
6.1.2 环境变量配置文件简介
环境变量配置文件中主要是定义对系统的操作环境生效的系统默认环境变量,比如PATH、HISTSIZE、PS1、HOSTNAME等默认环境变量。
环境变量配置文件
/etc/profile
/etc/profile.d/*.sh
~/.bash_profile
~/.bashrc
/etc/bashrc
6.2 环境变量配置文件作用
小贴士:
- /etc 目录下的对所有用户都生效
- ~/.bash_profile 和 ~/.bashrc -> 每个用户自己的配置文件,只对用户生效。
下图为配置文件读取顺序:
注:上图从左到右如果没有叠加,后面的命令会覆盖前面的命令。
/etc/profile的作用:
USER变量:
LOGNAME变量:
MAIL变量:
PATH变量:
HOSTNAME变量:
HISTSIZE变量:
umask:
调用/etc/profile.d/*.sh文件
~/.bash_profile的作用
调用了~/.bashrc文件。
在PATH变量后面加入了“:$HOME/bin”这个目录
6.3 其他配置文件和登录信息
6.3.1 注销时生效的环境变量配置文件
~/.bash_logout
6.3.2 历史命令配置文件
~/bash_history
6.3.3 Shell登录信息
- 本地终端欢迎信息: /etc/issue
-
远程终端欢迎信息: /etc/issue.net
转义符在/etc/issue.net文件中不能使用
是否显示此欢迎信息,由ssh的配置文件/etc/ssh/sshd_config决定,加入“Banner /etc/issue.net”行才能显示(记得重启SSH服务)
-
登陆后欢迎信息:/etc/motd
不管是本地登录,还是远程登录,都可以显示此欢迎信息