Shell概述
Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序
Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强。Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令。
Shell分类
B Shell - sh、ksh、Bash 、psh、zsh后缀文件
C Shell - csh、tcsh
彼此不兼容
Bash与sh兼容,现在使用的LInux就是使用Bash作为用户的基本Shell
Shell脚本的执行方式
echo输出命令 echo [选项] [输出内容]
-e 支持反斜线控制的字符转换
可以改变字体的颜色 echo -e “\e[1;31m abcd \e[0m”
第一个脚本
vi hello.sh
第一行**#!/bin/Bash** 不是注释,而是标识,不能省略,表示以下写的程序都是Shell程序
脚本执行
赋予执行权限,直接运行
chmod 755 hello.sh
./hello.sh
或者通过Bash调用执行脚本
dos2unix 文件名 #完成Windows格式转换为Linux格式
Bash基本功能
历史命令 history [选项] [历史命令保存文件]
-c 清空历史命令
-w 把缓存中的历史命令写入历史命令保存文件 ~/.bash_history
历史命令的调用
使用上、下箭头调用以前的历史命令
使用“!n”重复执行第n条历史命令
使用“!!”重复执行上一条命令
使用“!字串”重复执行最后一条以该字串开头的命令
命令与文件补全TAB
按两次TAB键可以调出系统中当前字符串开头的所有命令
目录与文件也可以实现上述功能,按一次TAB键实现自动补全,按两次TAB键实现调出当前字符串开头的所有命令
别名
命令别名 alias
alias 别名=‘原命令’ # 设定命令别名
alias # 查询命令别名
命令执行时顺序
第一顺位执行用绝对路径或相对路径执行的命令
第二顺位执行别名
第三顺位执行Bash的内部命令
第四顺位执行按照$PATH环境变量定义的目录查找顺序找到的第一个命令
让别名永久生效 vi /root/.bashrc
删除别名 unalias 别名
快捷键
快捷键
作用
ctrl + A
把光标移动到命令行开头。如果我们输入的命令过长,想要把光标移动到命令行开头时使用
ctrl + E
把光标移动到命令行结尾
ctrl + C
强制终止当前的命令
ctrl + L
清屏,相当于clear命令
ctrl + U
删除或剪切光标之前的命令。我输入了一行很长的命令,不用使用退格键一个一个字符的删除,使用这个快捷键回更加方便
ctrl + K
删除或剪切光标之后的内容
ctrl + Y
粘贴内容
ctrl + R
在历史命令中搜索
ctrl + D
退出当前终端
ctrl + Z
暂停,并放入后台
ctrl + S
暂停屏幕输出
ctrl + Q
回复屏幕输出
输入输出重定向(类似于文件输入输出)
标准输入输出
设备
设备文件名
文件描述符(代号)
类型
键盘
/dev/stdin
0
标准输入
显示器
/dev/stdout
1
标准输出
显示器
/dev/stderr
2
标准错误输出
输出重定向
类型
符号
作用
标准输出重定向
命令 > 文件
以覆盖的方式,把命令的正确输出输出到指定的文件或设备当中
标准输出重定向
命令 >> 文件
以追加的方式,把命令的正确输出输出到指定的文件或设备当中
标准错误输出重定向
错误命令 2> 文件
以覆盖的方式,把命令的错误输出输出到指定的文件或设备当中
标准错误输出重定向
错误命令 2>> 文件
以追加的方式,把命令的错误输出输出到指定的文件或设备当中
类型
符号
作用
正确输出和错误输出同时保存
命令 > 文件 2>&1
以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中
正确输出和错误输出同时保存
命令 >> 文件 2>&1
以追加的方式,把正确输出和错误输出都保存到同一个文件当中
正确输出和错误输出同时保存
命令 &> 文件
以覆盖的方式,把正确输出和错误输出都保存到同一个文件当中
正确输出和错误输出同时保存
命令 &>> 文件
以追加的方式,把正确输出和错误输出都保存到同一个文件当中
正确输出和错误输出同时保存
命令>>文件1 2 >>文件2
把正确的输出追加到文件1中,把错误的输出追加到文件2中
输入重定向 wc [选项] [文件名]
< 统计字节数、单词数、行数,如wc < anaconda-ks.cfg
-c 统计字节数
-w 统计单词数
-l 统计行数
ctrl + d 结束输入
多命令顺序执行
多命令执行符
格式
作用
;
命令1;命令2
多个命令顺序执行,命令之间没有任何逻辑联系
&&
命令1&&命令2
逻辑与(命令1对就执行命令2)
||
命令1||命令2
逻辑或(命令1错就执行命令2)
date; dd if=/dev/zero of=/root/testfile bs=1k count=100000; date
逻辑与:./configure && make && make install
管道符 命令1 | 命令2 # 命令1的正确输出作为命令2的操作对象
grep [选项] “搜索内容” 文件名
-i 忽略大小写
-n 输出行号
-v 反向查找
–color=auto 把搜索出的关键字用颜色显示
通配符和其他特殊符号
通配符
作用
?
匹配一个任意字符
*
匹配0个或任意多个任意字符,也就是匹配任何内容
[]
匹配括号中任意一个字符
[-]
匹配括号中任意一个字符,-代表一个范围,如[a-z]
[^]
逻辑非,表示匹配不是中括号内的一个字符,如[ ^0-9]
Bash中的其他特殊符号
符号
作用
‘’
单引号。在单引号中的所有特殊符号,都没有特殊含义
“”
双引号。在双引号中特殊符号都没有特殊含义,但"$"、"`"、"\ " 例外
··
反引号。反引号括起来的内容是系统命令,在Bash中会先执行它。和$()作用一样
$()
引用系统命令
#
表示注释
$
用于调用变量的值,如需要调用变量name的值时,需要用$name的方式得到变量的值
\
转义符,跟在\之后的特殊符号将失去特殊含义
Bash变量
变量分类
用户自定义变量
环境变量:这种变量中主要保存的是和系统操作环境相关的数据
位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。
预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的
从上到下限制得越来越严
用户自定义变量
什么是变量
变量是计算机内存的单元,其中存放的值可以改变。当Shell脚本需要保存一些信息时,如一个文件名或是一个数字,就把它存放在一个变量中。每个变量有一个名字,所以很容易引用它。使用变量可以保存有用信息,使系统获知用户相关设置,变量也可以用于保存暂时信息。
变量设置规则
变量名称可以由字母、数字和下划线组成,但是不能以数字开头
在Bash中,变量的默认类型都是字符串型,如果要进行数值计算,则必修指定变量类型为数值型
变量用等号连接值,等号左右两侧不能有空格
变量的值如果有空格,需要使用单引号或双引号包括
在变量的值中,可以使用“\”转义符
如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含“
变
量
名
”
或
用
变量名”或用
变 量 名 ” 或 用 {变量名}包含
如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令
环境变量名建议大写,便于区分
变量调用 echo $name
变量查看 set
变量删除 unset name
环境变量
什么是环境变量
用户自定义变量只在当前的Shell中生效,而环境变量会在当前Shell和这个Shell的所有子Shell当中生效。如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的Shell中生效。
设置环境变量 export 变量名=变量值
查询变量 env
删除变量 unset 变量名
系统常见环境变量
位置参数变量(类似于函数的形参)
位置参数变量
作用
$n
n为数字,$0表示命令本身,$1-
9
代
表
第
一
个
到
第
九
个
参
数
,
十
以
上
的
参
数
需
要
用
大
括
号
包
含
,
如
9代表第一个到第九个参数,十以上的参数需要用大括号包含,如
9 代 表 第 一 个 到 第 九 个 参 数 , 十 以 上 的 参 数 需 要 用 大 括 号 包 含 , 如 {10}
$*
这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体(只执行一次)
$@
这个变量也代表命令行的所有的参数,不过$@把每个参数区分对待(执行多次)
$#
这个变量代表命令行中所有参数的个数
例子1(canshu1.sh)
#!/bin/bash
num1= $1
num2= $2
sum= $(( $num1+ $num2))
echo $sum
例子2(canshu2.sh)
#!/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
预定义变量
预定义变量
作用
$?
最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确
$$
当前进程的进程号(PID)
$!
后台运行的最后一个进程的进程号(PID)
例子3(canshu3.sh)
#!/bin/bash
echo "The current process is $$"
find /root -name hello.sh &
echo "The last one Daemon process is $! "
接收键盘输入 read [选项] [变量名]
-p “提示信息”: 在等待read输入时,输出提示信息
-t 秒数: read命令会一直等待用户输入,使用此选项可以指定等待时间
-n 字符数: read命令只接受指定的字符数,就会执行
-s: 隐藏输入的数据,适用于机密信息的输入
例子4(canshu4.sh)
#!/bin/bash
read -t 30 -p "Please input your name: " name
echo "Name is $name "
read -s -t 30 -p "Please enter your age: " age
echo -e "\n"
echo "Age is $age "
read -n 1 -t 30 -p "Please select your gender[M/F]: " gender
echo -e "\n"
echo "Sex is $gender "
数值运算与运算符
declare 声明变量类型 declare [+/-] [选项] 变量名
-: 给变量设定类型属性
+: 取消类型的类型属性
-i: 将变量声明为整型
-x 将变量声明为环境变量
-p: 显示指定变量的被声明的类型
expr或let数值运算工具
dd=$(expr $aa + $bb) #dd的值是aa和bb的和。注意"+"左右两侧必须有空格
(
(
运
算
式
)
)
或
"
((运算式)) 或 "
( ( 运 算 式 ) ) 或 " [运算式]"
ff=
(
(
((
( ( aa+$bb))
gg=
[
[
[ aa+$bb]
运算符(具体见参考书)
变量测试与内容替换(见参考书)
变量置换方式
变量y没有设置
变量y为空值
变量y设置值
x=${y-新值}
x=新值
x为空
x=$y
x=${y:-新值}
x=新值
x=新值
x=$y
……
……
……
……
环境变量配置文件
简介
source 配置文件
或 . 配置文件
环境变量配置文件中主要是定义对系统的操作环境生效的系统默认环境变量,比如PATH、HISTSIZE、PS1、HOSTNAME等默认环境变量
常用环境变量配置文件
/etc/profile(所有用户生效)
/etc/profile.d/*.sh(所有用户生效)
~/.bash_profile(当前用户生效,且是隐藏文件)
~/.bashrc(当前用户生效,且是隐藏文件)
/etc/bashrc
作用(见参考书)
配置文件下设置(见参考书)