shell学习笔记
**********************************一:shell概述
1.shell是命令解释器,它提供一个用户输入命令及输出信息的界面用户输入-->shell-->内核-->硬件-->内核-->shell-->输出
2.shell的功能是翻译和编程
3.在 /etc/shells 中查看系统支持的shell版本,linux 默认使用bash
4. cd 是shell内置的命令,不是linux系统命令
type cd 查看cd是不是shell内置的命令
type也是shell内置的命令
二:shell脚本执行方式
1. shell变量的定义
变量名=值(该种定义变量的方法定义的变量叫做本地变量)本地变量的特点是:它只能影响当前shell,不会影响子shell
环境变量的特点是它会影响到子shell
set 显示所有的变量(包括本地变量和环境变量 )
env (export 或者 export -p) 显示所有的环境变量
注意:在定义变量时前面没有$,第一个字符不能是数字
2. shell变量输出
2.1 echo输出命令格式:echo [选项][输出内容]
注意:如果内容中间有空格,要用""将内容全部括起来如果没有可以不加
感叹号!有特殊作用,如果输出的内容中有感叹号,要用 ' '单引号将内容全部括起来
单引号的作用是去除引号内所有特殊字符的特殊功能
选项:
-e :支持反斜线控制的字符转换
\\ 输出\本身
\a 输出警告音
\b 退格键,也就是向左删除键
\c 取消输出行末的换行符,和“-n”选项一致
\e ESCAPE键
\f 换页符
\r 回车键
\t 制表符,也就是tab键
\v 垂直制表符
\0nnn 按照八进制ASCII码表输出字符,其中0为数字零,nnn是三位八进制数
\xhh 按照十六进制ASCII码表输出字符,hh是两位十六进制数
例如:echo -e "\e[1;31m 输出内容 \e[0m"
#输出颜色
#30m=黑色,31m=红色,32m=绿色,33m=黄色
#34m=蓝色,35m=洋红,36m=青色,37m=白色
2.2 echo $变量名 查看变量
注意:此处变量名前面要加$,如果不加$,shell 会把变量名当作普通字符打印出来
unset 变量名 取消变量
declare -x 定义环境变量
declare +x 取消环境变量
3.shell脚本执行(以.sh 为后缀)
方法一:赋予执行权限,直接运行chmod 755 hello.sh 赋予权限
./hello.sh 用相对路径或者绝对路径运行脚本
方法二:通过Bash调用执行脚本(可以不用给执行权限)
Bash hello.h
第一个shell脚本:
#!/bin/bash
#echo "上帝是笨蛋" 开头带#号的是注释
echo "上帝是笨蛋"
注意: 第一句是标称,代表我以下写的是shell语句,它不是注释,这一句必
需写,如果是非常简单的shell脚本也可以不写
笨蛋:dos2linux 将dos格式shell转换成linux格式shell
**************************************************************************************************
总结: 1.shell是什么
2.echo命令
3.执行第一个shell脚本
**************************************************************************************************
三.历史命令与补全
1.历史命令
1.1历史命令使用格式格式:history [选项] [历史命令保存文件]
选项:
-c: 清空历史命令(特殊情况下清空)
-w: 把缓存中的历史命令写入历史命令保存文件(~/.bash_history)中
注意:历史命令默认会保存1000条,可以在环境变量配置文件/etc/profile中进行修改
修改方法:打开/etc/profile文件找到如下信息
HISTSIZE=1000 hist代表history历史,size代表大小尺寸
历史命令保存文件命令装满的时候它会依次从第一条开始删除装入新的历史命令
笨蛋:/etc/profile(该文件是linux当中一个重要的环境变量配置文件)
1.2历史命令的调用
*通过上下键来调用
*使用“!n”重复执行第n条历史命令
*使用“!!”重复执行上一条命令
*使用“!字符”重复执行最后一条以该字符串开头的命令
2.tab键命令补全,使用tab键补全时,按两下tab键显示所有的可以补全的部分
**************************************************************************************************总结:
1.历史命令,如何查看历史命令,如何修改历史命令保存条数,如何调用历史命令
(常用的是上下键)
2.使用tab键进行命令及文件补全,此处只需记住按两次tab键可以显示需补全的部分
**************************************************************************************************
四.别名与快捷键
1.命令别名
1.1设定命令别名 alias 别名='原命令'
1.2查询命令别名 alias
1.3命令执行顺序:
1.第一顺位执行用绝对路径或相对路径执行的命令2.第二顺位执行别名
3.第三顺位执行bash的内部命令
4.第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令
注意:在命令行定义的别名它只会 临时生效,当系统重启之后就会消失
笨蛋:在linux当中,要想永久生效,归根结底是写入相应的配置文件
别名永久生效的方法:
vi /用户名/.bashrc
alias 别名='原命令'
注意:别名的名字如果和系统原有的命令名相同,则别名会覆盖掉系统命令,
转而执行别名所对应的原命令
1.4删除别名 unalias 别名
2.快捷键(linux(靠前的是常用的))
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 恢复屏幕输出
**************************************************************************************************
总结:
1.命令别名
2.linux中常用快捷键
**************************************************************************************************
五.输入输出重定向
1.标准输入输出
设备 设备文件名 文件描述符 类型键盘 /dev/stdin 0 标准输入
显示器 /dev/stdout 1 标准输出
显示器 /dev/stderr 2 标准错误输出
2.输出重定向
理解:将原本输出到屏幕上的内容改变输出方向,将其输出到文件中类型 符号 作用
标准输出重定向 命令> 文件 以覆盖的方式,把命令的正确输出输出到指定
的文件或设备中
命令>>文件 以追加的方式,把命令的正确输出输出到指定
的文件或设备中
标准错误输出重 命令2>文件 以覆盖的方式,把命令的错误输出输出到指定
定向 的文件或设备中
命令2>>文件 以追加的方式,把命令的错误输出输出到指定
的文件或设备中
注:以上将错误输出和正确输出分开保存的方法在实际工作中用处不大
以下为常用的方法
类型 符号 作用
命令 >文件 2>&1 以覆盖的方式,把正确输出和错误输出都保存
到同一个文件中
命令>>文件 2>&1 以追加的方式,把正确输出和错误输出都保存
到同一个文件
正确输出和 命令&>文件 以覆盖的方式,把正确输出和错误输出都保存
错误输出 到同一个文件
同时保存 命令&>>文件 以追加的方式,把正确输出和错误输出都保存
到同一个文件
命令>> 文件1 2>> 文件2 把正确的输出追加到文件1中,把错误的输出
追加到文件2中
笨蛋: /dev/null 是linux中一个特殊文件。
一个习惯用法:ls &>/dev/null 将输出丢到null中,null类似于垃圾箱,黑洞,
当我们对输出内容并不感兴趣而只关注命令的执行时可以用此命令
3.输入重定向
理解:将原本从键盘获取的标准输入改变方向,转而将文件中的内容作为标准输入格式:wc [选项] [文件名]
选项:
-c 统计字节数
-w 统计单词数 (以空格作为一个单词的结束标志)
-l 统计行数(此处是小写的L)
**************************************************************************************************
总结: 1.标准输入输出
2.输出重定向(重点)
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=个数 指定输入/输出多少个数据块
例如:
date;dd if=/dev/zero of=/root/testfile bs=1k count=100000;date
注:dd命令是linux当中进行磁盘复制或者数据复制的命令,但它不是cp,cp命令
只能复制文件,但是dd命令能复制特殊文件,也能复制分区甚至整个硬盘,它不仅
复制了数据,还复制了文件系统,dd主要用它来进行磁盘复制
2.管道符
命令格式: 命令1 |命令2注意:命令1的正确输出作为命令2的操作对象(只有命令1正确输出时才执行命令2)
笨蛋: 1.more 分屏显示命令
注意:more分屏显示的是文件的内容,它不能直接分屏显示命令的结果
例子:ll -a /etc/ |more 理解:将ll -a /etc/的输出作为more的操作对象
2.netstat 显示网络状态
3.grep [选项] "搜索内容" 文件名 (是在文件中搜索)
选项:-i 忽略大小写
-n 输出行号
-v 反向查找
--color=auto 搜索出的关键字用颜色显示
例子:netstat -an | grep "ESTABLISHED"
理解:1.netstat -an显示网络状态
2.grep "ESTABLISHED"在显示内容中搜索ESTABLISHED
**************************************************************************************************
总结:
1.多命令顺序执行
2.管道符
笨蛋:文件名是可以用数字的
**************************************************************************************************
回顾: 1.shell概述
2.shell脚本的执行方式(echo)
3.历史命令和补全(history Tab)
4.别名与快捷键(alias 别名='原命令')
5.输入输出重定向(> >> 2> 2>> 2>&1 )
6.多命令顺序执行(;&& || 管道符)
**************************************************************************************************
七.通配符和其他特殊符号
1.通配符
通配符 作用? 匹配一个任意字符
* 匹配0个或任意多个任意字符,也就是匹配任何内容
[] 匹配括号中任意一个字符,例如[abc] 匹配a或b或c中的任意一个
[ - ] -代表范围,例如[a-d]匹配a到b之间的任意一个字符
[^] 逻辑非,表示匹配不是括号内的一个字符。例如[^0-9]代表匹配一个
不是数字的字符
例:
cd /tmp/
ls -a
rm -rf *
touch abc
touch abcd
touch 012
touch 0abc
ls ?abc
ls [0-9]*
ls [^0-9]*
2.bash中其他特殊符号
符号 作用'' 单引号,在单引号中所有特殊符号,如$和 ` (反引号)都没有特殊意义
"" 双引号,在双引号中特殊符号都没有特殊含义,但是$和 ` 和 \ 是类外
拥有调用变量的值,引用命令,和转义字符的特殊含义
`` 反引号,反引号括起来的内容是系统命令,在bash中会先执行它,和
$()作用一样,不过推荐使用$(),因为反引号非常容易看错
$() 和反引号作用一样,用来引用系统命令
# 在shell脚本中,# 开头的行代表注释
$ 用于调用变量的值,如需要调用变量neme的值时,用$name
\ 转义符,跟在\之后的特殊符号将失去特殊含义,变为普通字符
如\$将输出$符号,而不当做是变量引用
注:反引号是esc下面那个键
反引号与$()
echo `ls`
echo $(date)
单引号与双引号
name=se
echo '$name'
echo "$name"
echo '$(date)'
echo "$(date)"
通配符是用来匹配文件名的
八.bash变量
1 什么是变量
变量是计算机内存单元,其中存放的值可以改变。当shell脚本需要保存一些信息时,如一个文件名或是一个数字,就把它存放在一个变量中。每一个变量都有一个名字,
所以很容易引用它。使用变量可以保存有用信息,使系统获知用户相关设置,变量也
可以用于保存暂时信息。
2 变量设置规则
a.变量名称可以有字母,数字和下划线组成,但是不能以数字开头。b.在bash中,变量的默认类型都是字符串型,如果要进行数值运算,
则必须指定变量类型为数值型。
c.变量用等号连接值,等号左右两侧不能有空格。
d.变量的值如果有空格,需要使用单引号或双引号包括。
e.在变量的值中,可以使用“\”转义符。
f.如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含
“$变量名”或用${变量名}包含。
g.如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令
h.环境变量名建议大写,便于区分。
3 变量分类
a.用户自定义变量b.环境变量:这种变量中主要保存的是和系统操作环境相关的数据
c.位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能
自定义,变量作用是固定的
d.预定义变量:是bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的
注:位置参数变量实质上是预定义变量的一种,只是位置参数变量相对较多,我们
习惯性的把它拿出来单独作为一个分类
4本地变量(也叫用户自定义变量)
a.变量定义name="上帝 是 笨蛋"
b.变量叠加
aa=123
aa="$aa"456
aa=${aa}789
c.变量调用
echo $name
d.变量查看
set
e.变量删除
unset name
**************************************************************************************************
本节重点:变量定义,命名规则以及分类
**************************************************************************************************
5.环境变量
5.1环境变量是什么
用户自定义变量只在当前shell中生效,而环境变量会在当前shell和这个shell的所有子shell中生效。如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有
的shell中生效
5.2 设置环境变量
export 变量名=变量值#声明变量(export的意思是把这个变量声明成全局变量)
env
#查询变量
unset 变量名
#删除变量
注:以上讲的是用户自定义的环境变量,但环境变量用得更多的地方是系统自带的环境变量,
也就是用env看到的环境变量
笨蛋:pastree 确定进程数
5.3 系统常见环境变量
1. PATH: 系统查找命令的路径
echo $PATH/usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/.....
注:
a.在linux中,可执行文件不管是系统的还是自己写的要想运行都必须用路径,可以是绝对路径
也可以是相对路径,当我们敲入命令时,系统从PATH中搜索命令所在的路径,
b.其实tab键的补全也是在靠PATH的搜索路径
所以综合以上两点我们可以得到:
当我们把自己写的脚本路径加到PATH中,再次运行我们的脚本时可以不用加路径,让系统从
PATH中搜素,而且我们还可以用tab键来补全
c. 我们并不习惯把我们自己写的脚本直接拷贝到系统目录当中,这样容易与系统中的内容混淆
把我们自己搞晕,我们更习惯的是用变量叠加的方式将自己的脚本加到PATH 后边
PATH="$PATH":/root/sh
#PATH变量叠加
注意:这种叠加只是临时的,一旦重启就会消失,永久生效就必须写入相应的配置文件中
2. PS1:定义系统提示符的变量
严格来说PS1并不是环境变量,用env是看不到PS1的,只能用set查看,它是系统预留专门用于定义系统操作环境的变量,它是环境变量中的一个自分支,只是用env看不到
\d: 显示日期,格式为“星期 月 日”
\b: 显示简写主机名,如默认主机名“localhost”
\t: 显示24小时制时间,格式为“HH:MM:SS”
\T: 显示12小时制时间,格式为“HH:MM:SS”
\A: 显示24小时制时间,格式为“HH:MM”
\u: 显示当前用户名
\w: 显示当前所在目录的完整名称
\W: 显示当前所在目录的最后一个目录
\#: 执行的第几条命令
\S: 提示符。如果是root用户会显示提示符为#,如果是普通用户会显示$
例如:
PS1="[\u@\t\w]\$"
PS1="[\u@\@ \h\#\W]\$"
PS1="[\u@\h\W]\$"
注意:系统默认的环境变量都是大写
**************************************************************************************************
总结: 1.环境变量和本地变量的区别:
环境变量和本地变量的区别是它们的作用范围不同最主要的区别是环境变量对一个系列的shell生效,
本地变量只对当前shell生效
2.环境变量允许用户自由定义,但是最重要的是系统默认的环境变量,一个是PATH
一个是PS1
**************************************************************************************************
6.位置参数变量
位置参数变量 作用$n n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,
十以上的参数需要用大括号包含,如${10}
$* 这个变量代表命令行中所有的参数,$* 把所有的参数看成一个整体
$@ 这个变量也代表命令行中所有的参数,不过$@把每个参数区别对待
$# 这个变量代表命令行中所有参数的个数
注意:位置参数变量是固定的,它的变量的变量名是固定的,它的作用也是固定的,我们
能做的就是传入不同的值
例子1:(新建canshu1.sh)
#!/bin/bash
echo $0
echo $1
echo $2
echo $3
输入1:./canshu1.sh
输出1:./canshu1.sh
输入2:./canshu1.sh 11 22 33
输出2:./canshu1.sh
11
22
33
例子2:(新建canshu2.sh)
#!/bin/bash
sum=$(($1+$2))
echo "$1加$2=$sum"
例子3:$*与$@ 的区别
#!/bin/bash
for i in "$*"
do
echo "The parameters is: $i"
done
x=1
for y in "$@"
do
echo "The parameter$x is:$y"
x=$(($x+1))
done
7.预定义变量
注:位置参数变量是预定义变量中的一种,因为其内容较多,所以单独提出讲解系统事先规定好的,变量名不能更改,变量的作用不能更改。我们只能传入不同的值
1.预定义变量 作用
$? 最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行:如果这个变量的值为非零(具体是哪个数,由命令自己来决定),则证明上一个命令执行
不正确。(该变量最常用,思考与&& || 的联系)
$$ 当前进程的进程号(PID)
$! 后台运行的最后一个进程的进程号(PID)
例子:(新建variable.sh)
#!/bin/bash
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 $!"
2.接收键盘输入
read [选项][变量名]选项:
-p "提示信息": 在等带read输入时,输出提示信息
-t 秒数: read命令会一直等待用户输入,使用此选项可以指定等待时间
-n 字符数: read命令只接受指定的字符数,就会执行
-s : 隐藏输入的数据,适用于机密信息的输入
例子:
#!/bin/bash
read -t 30 -p "Pleasee input your name:" name
#提示“请输入姓名”并等待30秒,把用户的输入保存入变量name中
echo "Name is Sname"
read -s -t 30 -p "Please enter your age: " age
#年龄是隐私,素以我们用 -s 选项隐藏输入
echo -e "\n"
echo "Age is $age"
read -n 1 -t 20 -p "Please select your gender[M/F]:" gender
#使用 -n 1 选项只接收一个输入字符就会执行(都不用输入回车)
echo -e "\n"
echo "Sex is Sgender"
九.bash的运算符
1.数值运算与运算符
a.declare声明变量类型格式: declare [+/-][选项] 变量名
选项:
-: 给变量设定类型属性
+: 取消变量的类型属性
-i: 将变量声明为整数型(integer)
-x: 将变量声明为环境变量
-p: 显示指定变量的被声明的类型
b.数值运算--方法1
aa=11
bb=22
declare -i cc=$aa+$bb (将变量cc强制声明成整数型)
c.数值运算--方法2:expr或let数值运算工具
aa=11
bb=22
dd=$(expr $aa + $bb)
#+”号左右两侧必须有空格
d."$((运算符))"或"$[运算符]"
aa=11
bb=22
ff=$(($aa+$bb))
gg=$[$aa+$bb]
e.优先级 运算符 说明
13 -,+ 单目负,单目正
12 !,` 逻辑非,按位取反或补码
11 *,/,% 乘,除,取模
10 +,- 加,减
9 <<,>> 按位左移,按位右移
8 <=,>=,<,> 小于或等于,大于或等于,小于,大于
7 ==,!= 等于,不等于
6 & 按位与
5 ^ 按位异或
4 | 按位或
3 && 逻辑与
2 || 逻辑或
1 =,+=,-=,*=,<<=,>>= 赋值,运算且赋值
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
错误输出 错误输出
例子:测试x=${y-新值}
[root@localhost ~]# unset y
[root@localhost ~]# x=${y-新值}
[root@localhost ~]# echo $x
new
因为变量y不存在,所以x=new