本篇文章适于已经把shell学习完的人员人来进行参考的,不太始于零基础来,参考学习,零基础更适于观看视频学习shell
Shell概念
shell是一个C语言编写的程序,它是用户使用Linux的桥梁。Shell即是一种命令语言,又是一种程序设计语言。
Bash特性
Shell类型:
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
引号类型:
单引号:无视特殊字符
双引号:识别特殊符号
无引号:连续的字符可以不加引号
反引号:引用命令执行结果,等于$()用法
输入输出重定向
设备名 文件描述符 类型
/dev/stdin 0 标准输入
/dev/stdout 1 标准输出
/dev/stderr 2 标准错误输出
变量类型和加载
变量配置文件
用户个人配置文件:~/.bash_profile,~/.bashrc远程登录用户特有文件
全局配置文件:/etc/profile,/etc/bashrc,全局配置文件,影响所有登录系统的用户
声明变量:declare,typeset
declare -i num #声明整数变量
declare -r readonly #声明只读变量
declare -a arr=‘([0]=”a” [1]=”b” [2]=”c”)’ #生成数组变量
检查系统环境变量的命令:
set:输出所有变量,包括全局变量,局部变量
env:只显示全局变量
declare:输出所有变量
export:显示和设置环境变量值
撤销环境变量
unset 变量名,删除变量或函数
设置只读变量
直接readonly显示当前系统只读变量
readonly name只读变量
特殊变量
$0:获取shell脚本文件名,以及脚本路径
$n:获取shell脚本的第n个参数,n在1~9之间,参数需要空格隔开
$#:获取执行的shell脚本后面的参数总个数
$*:获取shell所有参数
@:同@:同*,如果加了双引号,会把所有参数为独立的字符串分开
特殊状态变量
$?:上次命名执行状态,0正确,其他为失败
$$:当前shell的进程号
$!:上一次后台进程PID
$_:获取上一次执行的命令的最后一个参数
特殊shell扩展变量
${parameter:-word} #如果parameter变量值为空,返回word字符串
${parameter:=word} #如果parameter变量为空,则word替代变量值,且返回
${parameter:?word} #如果parameter变为空,word当作错误输出,否则正常输出
${parameter:+word} #如果变量为空,什么都不做,否则word返回
内置shell命令
echo命令
选项:
-n:不换行
-e:解析字符串中的特殊字符
\n换行
\回车
\t制表符
\b退格
printf命令
作用:打印与echo相同
与echo的区别:自动识别特殊字符,不自动添加换行符
eval命令
作用:执行多个命令
格式:eval 命令;命令;命令
exec命令
作用: 不创建子进程,执行后续命令;并执行完毕后,自动exit退出
Shel字串的花括号用法
${变量名}:返回变量值
${#变量名}:返回变量长度,字符长度
截取:
${变量名:start}:返回变量start数值之后的字符,start是数字
${变量名:start:stop}:返回变量从start下标到stop的所有字符
删除:
${变量名#word}:从变量开头删除最短匹配的word字串
${变量名##word}:从变量开头删除最长匹配的word字串
${变量名%word}:从变量结尾删除最短的word字串
${变量名%%word}:从变量结尾删除最长匹配的word字串
替换:
${变量名/pattern/string}:用string代替第一个匹配的pattern字串
${变量名//pattern/string}:用string代替所有的pattern字串
内置命令,外置命令
内置命令:在系统启动时就载入内存,常驻内存,执行效率高,但是占用资源
外置命令:用户需要从硬盘中读取程序文件,再读入内存加载
Shell运算符
1.算数运算符
逻辑概念:真为1 假为0
shell中常见的算数运算命令
(()) 用于整数运算的常用运算符,效率高
let 用于整数运算,类似(())
expr 可用于整数运算,但是还有很多其他功能
bc 计算器程序(适合整数及小数运算)
$[ ] 用于整数运算
awk awk既可以整数运算,和小数运算
declare 定义变量值和属性,-i参数可以用于定义整形变量做运算
特殊符号符号
++:自增
--:自减
2.关系运算符
运算符 说明
-eq 检测两个数是否相等
-ne 检测两个数是否不同
-gt 检测第一个数值是否大于右边数值
-lt 检测第一个数值是否小于右边数值
-ge 检测第一个数值是否大于等于右边的数值
-le 检测第一个数值是否小于等于第二个数值
3.逻辑运算符
运算符 说明
! 非运算,取反
-o 或运算,第一个表达式为true则返回true
-a 与(并且)运算,所有表达式都为true才返回true
4.字符串运算符
运算符 说明
= 检测两个字符是否相等
!= 检测两个字符是否不相等
-z 检测字符串长度是否为0
-n 检测字符串长度是否不等于0
str 检测字符串是否为空
5.文件测试运算符
操作符 说明
-b file 检测文件是否是块文件
-c file 检测文件是否是字符设备文件
-d file 检测文件是否是目录
-f file 检测文件是否是普通文件
-p file 检测文件是否是有名管道
-g file 检测文件是否设置了SGID位
-k file 检测文件是否设置了粘着位
-u file 检测文件是否设置了SUID位
-r file 检测文件是否可读
-w file 检测文件是否可写
-x file 检测文件是否可执行
-s file 检测文件是否为空
-e file 检测文件是否存在
接受键盘输入
read [选项] [变量名]
选项:
-a:后面跟一个变量,该变量会被认为是个数组,然后给其赋值,默认是以空格为分割符。
-p:提示信息:在等待read输入时,输出提示信息
-t:秒数:read命令会一直等待用户输入,使用此选项可以指定等待时间
-n:数字:read命令只接受指定的字符数,就会执行
-s:隐藏输入的数据,适合机密信息的输入
-d:后面跟一个标志符,其实只是其后的第一个字符有用,作为结束的标志
-e:在输入的时候可以使用命令补全功能
变量名:
变量名可以自定义,如果不指定变量名,会把输入保存默认变量REPLY
如果只提供了一个变量名,则整个输入行赋予给变量
如果提供了一个以上的变量,则输入行分为若干字,一个接一个的赋予各个变量,而命令行上的最后一个变量取得剩余的所有字
流程控制
单分支if语法:
if [ 条件判断式 ]
then
程序
fi
双分支if条件语句
if [ 条件判断式 ]
then
条件成立时,执行的程序
else
条件不成立,执行的另一个程序
fi
多分支if条件语句
if [ 条件判断式1 ]
then
当条件判断式1成立时,执行程序1
elif [ 条件判断式2 ]
then
当条件判断式2成立时,执行程序2
else
当所有条件都不成立,最后执行程序
fi
多分支case条件语句
case $变量名 in
“值1”)
如果变量的值等于值1,则执行程序1
;;
“值2”)
如果变量的值等于值2,则执行程序2
;;
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
循环语句
for语法一:
for 变量 in 值1 值2 值3 (可以是一个文件等)
do
程序
done
注:这种语法中for循环的次数,取决于in后面值的个数(空格分割),有几个值就循环几次,并且每次循环都把值赋予变量。
for语法二:
for ((初始值;循环控制条件;变量变化))
do
程序
done
注:语法二注意:
初始值:在循环开始时,需要给某个变量赋予初始值,如i=1
循环控制条件:用于指定变量循环次数,如i<=100,则只要i的值小于等于100,循环就会继续
变量变化:每次循环之后,变量该如何变化,如i=i+1。代表每次循环之后,变量i的值都加1
while循环语法:
while [ 条件判断式 ]
do
程序
done
until循环语法:
until [ 条件判断式 ]
do
程序
done
注:和whlie循环相反,until循环时只要条件判断式不成立则进行循环,并执行循环程序,一旦循环条件成立,则终止循环。
函数
语法:
function 函数名 () {
程序
}
特殊流程控制语句