1 历史别名与常用快捷键
1.2 命令别名
alias 别名=‘原命令’
#设定命令别名
alias
#查询命令别名S
命令执行时顺序
-
第一顺位执行用绝对路径或相对路径执行的命令
-
第二顺位执行别名
-
第三顺位执行BASH的内部命令
-
第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令
让别名永久生效
vi /root/.bashrc
1.2 Bash常用快捷键
ctrl+A 把光标移到命令行开头
ctrl+E 把光标移到命令行末尾
ctrl+C 强制中止当前的命令
ctrl+L 清屏,相当于clear命令
ctrl+U 删除或剪切光标之前的命令,我输入了一行很长的命令,不用使用退格键一个一个字符的删除,使用这个快捷键会更加方便
ctrl+K 删除或剪切光标之后的内容
ctrl+Y 粘贴ctrl+U或ctrl+K剪切的内容
ctrl+R 在历史命令中搜索,按下ctrl+R之后,就会出现搜索界面,只要输入搜索内容,就会从历史命令中搜索
ctrl+D 退出当前终端
ctrl+Z 暂停,并放入后台,这个快捷键牵扯工作管理的内容
ctrl+S 暂停屏幕输出
ctrl+Q 恢复屏幕输出
2 输入输出重定向
2.1 标准输入输出
设备 | 设备文件名 | 文件描述符 | 类型 |
---|---|---|---|
键盘 | /dev/stdin | 0 | 标准输入 |
显示器 | /dev/sdtout | 1 | 标准输出 |
显示器 | /dev/sdterr | 2 | 标准错误输出 |
2.2 输出重定向
类型 | 符号 | 作用 |
---|---|---|
标准输出重定向 | 命令 > 文件 | 以覆盖的方式,把命令的正确输出,输出到指定的文件或设备当中 |
~ | 命令 >> 文件 | 以追加的方式,把命令的正确输出,输出到指定的文件或设备当中 |
标准错误输出重定向 | 错误命令 2> 文件 | 以覆盖的方式,把命令的正确输出,输出到指定的文件或设备当中 |
~ | 错误命令 2>> 文件 | 以追加的方式,把命令的正确输出,输出到指定的文件或设备当中 |
命令 > 文件 2>&1 | 以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中 | |
---|---|---|
命令 >> 文件 2>&1 | 以追加的方式,把正确输出和错误输出都保存到同一个文件当中 | |
正确输出和错误输出同时保存 | 命令 &> 文件 | 以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中 |
命令 &>> 文件 | 以追加的方式,把正确输出和错误输出都保存到同一个文件当中 | |
命令 >> 文件1 2>>文件2 | 把正确的输出追加到文件1中,把错误的输出追加到文件2中 |
2.3 输入重定向
wc [选项] [文件名] 选项
-c 统计字节数
-w 统计单词数
-l 统计行数
命令<文件 把文件作为命令的输入
3 多命令顺序执行与管道符
3.1 多命令顺序执行
多命令执行符 | 格式 | 作用 |
---|---|---|
; | 命令1 ; 命令2 | 多个命令顺序执行,命令之间没有任何逻辑联系 |
&& | 命令1 && 命令2 | 逻辑与 当命令1正确执行,则命令2 才会执行;当命令1执行不正确,则命令2不会执行 |
|| | 命令1 || 命令2 | 逻辑或 当命令1执行不正确,则命令2才会执行;当命令1正确执行,则命令2不会执行 |
dd if=输入文件 of=输出文件 bs=字节数 count=个数 (主要用于磁盘复制)
选项:
if=输入文件 制定源文件或源设备
of=输出文件 制定目标文件或目标设备
bs=字节数 制定一次输入/输出多少字节,即把这些字节看做一个数据块
count=个数 制定输入/输出多少个数据块
例子:
[root@localhost~]# date ; dd if=/dev/zero of=/root/testfile bs=1k count=1000 ; date
&&例子:
./configure && make && make install 自动安装
||例子:
ls /root/test || echo no
&& ||组合例子:
命令 && echo yes || echo no
3.2管道符
命令格式:
[root@localhost~]#命令1 | 命令2
#命令1的正确输出作为命令2的操作对象
颜色显示
[root@localhost~]# grep [选项] "搜索内容" 文件名
选项
-i 忽略大小写
-n 输出行号
-v 反向查找
--color=auto 搜索出的关键字用颜色查找
root@ubuntu:/home/mlz/Desktop# grep -n --color=auto "root" /etc/passwd
1:root:x:0:0:root:/root:/bin/bash
37:nm-openvpn:x:118:124:NetworkManager OpenVPN,,,:/var/lib/openvpn/chroot:/usr/sbin/nologin
4 通配符和其他特殊符号
4.1 通配符
通配符 | 作用 |
---|---|
? | 匹配一个任意字符 |
* | 匹配0个或任意多个任意字符,也就是可以匹配任何内容 |
[] | 匹配中括号中任意一个字符。例如:[abc]代表一定匹配一个字符,或者是a,或者是b,或者是c |
[-] | 匹配中括号中任意一个字符,-代表一个范围。例子:[a-z]代表匹配一个小写字母 |
[^] | 逻辑非,表示匹配不是中括号内的一个字符。例如:[ ^0-9 ]代表匹配一个不是数字的字符 |
cd /tmp/
rm -rf * 删除当前目录下所有文件
touch abc
touch abcd
touch 012
touch 0abc
ls ?abc
ls *abc
ls [0-9]*
ls [^0-9]*
4.2 Bash中其他特殊符号
符号 | 作 用 |
---|---|
' ' | 单引号。在单引号中所有的特殊符号,如“$”和“`”(反引号)都没有特殊含义 |
" " | 双引号。在双引号中特殊符号都没有特殊含义,但是"$"、"`"和"\"是例外,拥有“调用变量的值”、“引用命令”和“转义符”的特殊含义 |
`` | 反引号。反引号括起来的内容是系统命令,在Bash中会先执行它。和$()作用一样,不过推荐使用$() |
$() | 和反引号作用一样,用来引用系统命令 |
# | 在Shell脚本中,#开头的代表注释 |
| 用于调用变量的值,如需要调用变量name时,需要用name的方式得到变量的值 | |
\ | 转义符,跟在\之后的特殊符号将失去特殊含义,变为普通字符。如$将输出"$"符号,而不当作是变量引用 |
5 Bash变量
5.1 用户自定义变量
5.1.1 变量设置规则
-
变量名称可以由字母、数字和下划线组成,但是不能以数字开头。如果变量名是“2name”则是错误的
-
在Bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必修指定变量类型为数值型
-
变量用等号连接值,等号左右两侧不能有空格
-
变量的值如果有空格,需要使用单引号或双引号包括
-
在变量的值中,可以使用“\”转义符
-
如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含“$变量名”或用${变量名}包含
-
如果是把命令的结果i作为变量值赋予变量,则需要使用反引号或$()包含命令
-
环境变量名建议大写,便于区分
5.1.2 变量分类
-
用户自定义变量
-
环境变量:这种变量主要保存的是和系统操作环境相关的数据
-
位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的
-
预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的
5.1.3 本地变量
变量定义
[root@localhost~]# name="mlz"
变量叠加
[root@localhost~]# aa=123
[root@localhost~]# aa="$aa"456
[root@localhost~]# aa= ${aa}789
变量调用
-
[root@localhost~]# echo $name
变量查看
-
[root@localhost~]# set
变量删除
-
[root@localhost~]# unset name
5.2 环境变量
5.2.1 设置环境变量
export 变量名=变量值
#申明变量
env
#查询变量
unset 变量名
#删除变量
pstree 查看bash
系统常见环境变量
root@ubuntu:/home/mlz/Desktop# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
vi hello.sh
#!/bin/bash
echo "hello world!"
chmod 755 hello.sh
./hello.sh
echo $PATH
cp hello.sh /bin/
hello.sh
PATH="$PATH":/root #临时添加,重启后会失效
hello.sh
echo $PATH
------:/root/bin:/root
5.2.2 PS1:定义系统提示符的变量
\d | 显示日期,格式为“星期 月 日” |
---|---|
\h | 显示默认主机名。如默认主机名“localhost” |
\t | 显示24小时制时间,格式为“HH:MM:SS” |
\T | 显示12小时制时间,格式为“HH:MM:SS” |
\A | 显示24小时制时间,格式为“HH:MM” |
\u | 显示当前用户名 |
\w | 显示当前所在目录的完整名称 |
\W | 显示当前所在目录的最后一个目录 |
\# | 执行的第几个命令 |
\$ | 提示符。如果是root用户会显示提示符为“#”,如果是普通用户会显示提示符为“$” |
root@ubuntu:/home/mlz/Desktop# echo $PS1
\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$
5.3 位置参数变量
5.3.1 位置参数变量
位置参数变量 | 作 用 |
---|---|
n | n位数字,\$0代表命令本身,\$1-9代表第一个到第九个参数,十以上的参数需要用大括号包含,如${10} | |
* | 这个变量代表命令行中所有的参数,*把所有的参数看成一个整体 | |
@ | 这个变量也代表命令行中所有的参数,不过@把每个参数区分对待 | |
$# | 这个变量代表命令行中所有参数的个数 |
mlz@ubuntu:~/Desktop$vi canshu1.sh
mlz@ubuntu:~/Desktop$chmod 755 canshu1.sh
mlz@ubuntu:~/Desktop$./canshu1.sh
./canshu1.sh
mlz@ubuntu:~/Desktop$./canshu1.sh 11 22 33
./canshu1.sh
11
22
33
mlz@ubuntu:~/Desktop$cat canshu1.sh
#!/bin/bash
echo $0
echo $1
echo $2
echo $3
例子:
#!bin/bash
num1=$1
num2=$2
sum=$(($num1 + $num2))
#变量sum的和是num1加num2
echo $sum
#打印变量sum的值
./canshu2.sh 2 3
5
例子:
#!/bin/bash
echo $#
echo $*
echo $@
mlz@ubuntu:~/Desktop$chmod 755 canshu3.sh
mlz@ubuntu:~/Desktop$./canshu3.sh 22 3 44 55 112
5
22 3 44 55 112
22 3 44 55 112
#!/bin/bash
for i in "$*"
#$中的所有参数看成是一个整体,所以在个for循环只会循环一次
do
echo "The parameters is: $i"
done
x=1
for y in "$@"
#$中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次
do
echo "The paramaters$x is $y"
x=$(($x+1))
done
mlz@ubuntu:~/Desktop/bash_canshu$./canshu4.sh 233 112
The parameters is: 233 112
The paramaters1 is 233
The paramaters2 is 112
5.4 预定义变量
5.4.1 预定义变量
预定义变量 | 作 用 |
---|---|
$? | 最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一条命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一条命令执行不正确了。 |
$$ | 当前进程的进程号(PID) |
$! | 后台运行的最后一个进程的进程号 |
#!/bin/bash
#Author:mlz
echo "The current process is $$"
#输出当前进程的PID
#这个PID就是canshu5.sh这个脚本执行时,生成的进程的PID
find /home/mlz/Desktop/bash_canshu -name hello.sh &
#使用find命令在bash_test目录下查找hello.sh文件
#符号&的意思是把命令放在后台执行
echo "The last one Daemon process is $!"
mlz@ubuntu:~/Desktop/bash_canshu$ ./canshu5.sh
The current process is 17904
The last one Daemon process is 17905
5.4.2 接收键盘输入
[root@localhost ~]# read[选项][变量名]
选项:
-p "提示信息“ | 在等待read输入时,输出提示信息 |
---|---|
-t 秒数 | read命令会一直等待用户输入,使用此选项可以制定等待时间 |
-n 字符数 | read命令值接受指定的字符数,就会执行 |
-s | 隐藏输入的数据,适用于机密信息的输入 |
#!/bin/bash
#Author: mlz
read -t 30 -p "Please input your name:" name
#提示“请输入姓名”并等待30秒,把用户的输入保存入变量name中
echo "Name is $name"
read -s -t 30 -p "Please enter your ege: " age
#年龄是隐私,所以我们用“-s”选项隐藏输入
echo "Age is $age"
echo -e "\n"
read -n 1 -t 30 -p "Please select your gender[M/F]: " gender
#使用“-n l”选项只接收一个输入字符就会执行(都不用输入回车)
echo -e "\n"
echo "Sex is $gender"
6 数值运算与运算符
6.1 declare声明变量类型
[root@localhost ~]# declare[+/-][选项] 变量名
选项 | 含义 |
---|---|
- | 给变量设定类型属性 |
+ | 取消变量的类型属性 |
-i | 将变量声明为整数型(integer) |
-x | 将变量声明为环境变量 |
-p | 显示制定变量的被声明的类型 |
root@ubuntu:/home/mlz/Downloads/lab4_code# aa=11
root@ubuntu:/home/mlz/Downloads/lab4_code# bb=22
root@ubuntu:/home/mlz/Downloads/lab4_code# declare -i cc=$aa+$bb
root@ubuntu:/home/mlz/Downloads/lab4_code# echo $cc
33
方法2:expr或let数值运算工具
[root@localhost ~]# aa=11
[root@localhost ~]# bb=22
#给变量aa和变量bb赋值
[root@localhost ~]# dd=$(expr \$aa + \$bb)
#dd的值是aa和bb的和。注意“+”左右两侧必须有空格
方法3:"$((运算式))"或"$[运算式]"
[root@localhost ~]# aa=11
[root@localhost ~]# bb=22
[root@localhost ~]# ff=$(($aa+$bb))
[root@localhost ~]# gg=$[$aa+$bb]
6.2 运算符
7 变量测试与内容替换
测试x=${y-新值}
[root@localhost ~]# unset y
#删除变量y
[root@localhost ~]# x=$({y-new}
#继续测试
[root@localhost ~]# echo $x
new
#因为变量y不存在,所以x=new
8 环境变量配置文件
8.1 环境变量文件配置
8.1.1 source命令
[root@localhost ~]# source 配置文件
[root@localhost ~]# . 配置文件
作用是让配置文件直接生效,(.+空格)是source的缩写,否则配置文件需要重新打开才能生效
8.1.2 环境变量配置文件简介
环境变量配置文件中主要是定义对系统的操作环境生效的系统默认环境变量,比如PATH,HISTSIZE,PSI,HOSTNAME
-
保存在/etc目录下对所有登陆linux系统的用户都生效,每个用户登录都会读取配置文件中环境变量的值,且会生效
-
~是家目录的意思,在~/下的环境变量配置文件只会对当前用户生效,比如root用户的家目录下修改bashrc文件,那么对mlz用户是不起作用的
8.1.3 环境变量配置文件的作用
/etc/profile的作用:
-
USER变量
-
LOCALNAME变量
-
MAIL变量
-
PATH变量
-
HOSTNAME变量
-
HISTSIZE变量
-
umask:
-
调用/etc/profile.d/*.sh文件
8.1.4 其他配置文件和登陆信息
-
注销时生效的环境变量配置文件
-
~/.bash_logout
-
-
历史命令的保存文件
-
~/bash_history
-
-
登陆后欢迎信息:/etc/motd
-
不管是本地登陆,还是远程登陆,都可以显示次此欢迎信息