Linux shell学习(更新中....)
一、SHELL的概述
shell作用是解释,是底层操作系统核心和外界交流的基础,本质上是一个命令行的解释器,它接受应用程序/用户命令,然后调用操作系统内核。
shell还是一个功能相当强大的编程语言,易编写、易调试、灵活性强。
二、写一个SEHLL脚本
格式:
默认后缀是.sh,什么后缀无所谓,重点是约定俗称。
开头#!/bin/sh 表示当前指定使用的解释器。
#(井号)后面的是注释
每一行代表一个一个命令
三、执行一个shell脚本
1、sh+脚本的路径 (可以是相对路径也可以是绝对路径) 创建了一个新的shell去执行
2、bash+脚本的路径(可以是相对路径也可以是绝对路径) 创建了一个新的shell去执行 (可以bash以后 使用ps -f验证)
3、直接执行脚本文件(./脚本文件路径) 创建了一个新的shell去执行
4、source 脚本路径 当前shell执行
5、. 脚本路径(.是一个命令) 当前shell执行
6、将其cp到/bin/目录下就可以当做命令来执行。
7、系统是直接可以执行的命令都是在$PATH指定出来的目录下的命令
!! source 命令是指明配置环境变量
子shell中设置的一些环境变量在父shell中是不可见的,对于父shell中的变量,子shell 的更改是不会改变父shell 的变量
四、变量
shell中的变量可以分为两大类,第一类就是系统预定义的变量,第二类就是用户自定义变量 ,每一类还可以分为全局的变量和局部的变量。
4.1系统预定义变量
$HOME $PWD $SHELL $USER 等
可以直接使用echo进行查看
echo $HOME #用户信息
env #查看全部环境变量
printenv USER #查看user变量
set #查看当前的所有环境变量
使用变量的值的时候,都需要加上$()符号。
4.2自定义变量
定义变量:变量名=变量值 (=前后不可以有空格,声明的属于是局部变量)(局部变量export以后可以提升为全局变量)
撤销变量:unset 变量名
声明静态变量:readnoly变量 (不可以unset撤销)
变量命名规则:
1、最好使用小写,因为一般系统定义的变量是大写,等号两边不可以有空格
2、都是按照字符串去处理的,不是数字运算
3、可以使用(())或者是(())或者是(())或者是[]表示运算$[]只在shell 1.x版本中可以使用,后面的版本中就被舍弃了
4、可以定义只读变量 readonly name=value (相当于定义了一个常量)
4.3特殊变量
1、$n n是1-9的数字
$0表示脚本名称 $1-9表示传入的第n个变量,十以上的变量需要用花括号括起来9表示传入的第n个变量 ,十以上的变量需要用花括号括起来9表示传入的第n个变量,十以上的变量需要用花括号括起来{n}
2、$#
获取当前输入参数的个数
3、$*
代表命令行中的所有参数,把所有的参数看成一个整体**(使用双引号引起来以后是一个参数)**
4、$@
命令行中的所有参数,但是每个参数区分对待
5、$?
最后一次执行命令的返回状态,0表示最后一个命令正常执行,如果这个变量非0表示前面一个命令执行不正确
五、运算符
expr命令
expr 1 + 2 #返回1+2的值
expr 5 \* 2 #返回5*2的值
a=$(expr 1 + 2) #将1+2的值赋值给a
a='expr 1 + 2' #将1+2的值赋值给a
(())或者是(())或者是(())或者是[]
$((5*2)) #双小括号可以进行数字判断
$[5*2] #shell 1.x版本的语法 后面就被舍弃了
六、条件判断
标准格式
[ condition ] 方括号表示进行条件判断(注意方括号两边都有一个空格)
两个整数比较
-eq 等于(equal) -ne 不等于(not equal)
-lt 小于(less than) -le小于等于(less equal)
-gt 大于(greater than) -ge大于等于(greater equal)
判断文件权限
-r 是否可读
-w是否可写
-x是否可执行
判断文件类型(判断文件是否存在)
-e文件是否存在
-f文件是否存在并且是一个常规文件
-d文件是否存在并且是一个目录
多条件判断
使用逻辑|| 或者是 逻辑 &&
||表示前一个命令执行失败以后再执行下一个命令
&&表示上一个命令执行成 功以后再执行下一条命令
七、流程控制
可以使用let命令 在后面就可以使用常用的c语言运算了。
let i+=1
let i++ #注意符号两边不要加空格
7.1 if判断
单分支:
if [ condition ];then#程序
fiif [condition]
then#程序
fi
多分支:
if [ condition ]
then#程序1
elif[ condition ]
then#程序2
else#程序3
fiif [ condition ];then#程序1
elif[ condition ];then#程序2
else#程序3
fi
只有if以后需要加上then,else后面不需要加then
对于if判断,同样可以使用逻辑或||或者是逻辑与&&
在同一个括号中进行逻辑与是-a, 逻辑或是 -o
7.2 case语句
case $变量名 in
"值1")
;;
"值2")
;;
#其他分支
*)#默认分支
;;
esac #结束标志
7.3 for循环
for ((初始值;循环控制条件;变量变化))
do#程序
done#示例 一个求和脚本
#!/bin/bashecho "请输入一个数字"
read number
sum=0
for((i=1;i<=$number;i++))
dosum=$(($sum+$i))
done
echo $sumfor 变量 in 序列
do#程序
done
//例程
for os in linux windows macos;
do echo $os
donefor i in {1..100}
doecho $i
done
7.4 while循环
while [ condition ]
do#程序
done
7.5 read读取控制台输入
read (选项) (参数)
选项:
-p :指定读取值时的提示符
-t:指定读取值时的等待时间,如果不加-t的话移植等待。
read -t 7 -p "please enter you name:" name
#等待7秒,并输出提示符"please enter you name:"
八、函数
函数就是能够实现某种方法的指令集合。
8.1系统函数
一些常用的系统函数,持续更新…
date #获取当时系统时间
date +%s #获取当前系统时间戳basename[string/pathname][suffix] #取路径中文件的名称 会将suffix的后缀去掉,前面是pathname 截取当前路径最后一个斜杠之后的字符串#获取当前文件的路径名称 截取最后一个斜杠之前的命令 通常搭配pwd使用
dirname
8.2自定义函数
在调用函数之前,必须要声明函数。因为shell脚本是逐行运行,不会像其他语言一样先编译。
函数返回值只能通过$?系统变量获取
[function]funname[()] #[]中可以省略
{Action;[return int;]
}
#返回值只能是0-255 可以使用echo打印结果,通过$()来接受命令结果
function add(){S=$(($1+$2))echo "和:"$(S)
}
read -p "请输入第一个整数:" a
read -p "请输入第二个整数:" b
add $a $b
九、综合应用
#!/bin/bash
#判断输入参数是否为1
if [ $# -ne 1 ]
then echo "参数个数错误!应该输入一个参数,作为归档目录名"exit
fi
#从参数中获取目录名称
if [ -d $1 ]
then echo
elseecho echo "目录不存在"echoexit
fiDIR_NAME=$(basename $1)
DIR_PATH=$(cd $(dirname $1);pwd)#获取当前年月日
DATE=$(date +%y%m%d)
#定义归档文件名称和目标路径
FILE=achive_${DIR_NAME}_$DATE.tar.gz
DEST=/home/lijiaxi/archive/$FILE
#开始归档目录文件
echo "开始归档......"
echo
sudo tar -czf $DEST $DIR_PATH/$DIR_NAMEif [ $? -eq 0 ]
thenechoecho "归档成功"echo "归档文件为:$DESt"echo
elseecho "归档出现问题"echo
fi
exit
十、正则表达式
正则表达式是使用单个字符串来描述、匹配一系列符合某种语法规则的字符串
‘^’ 匹配一行的开头,^a匹配所有以a开头的行
'′匹配一行的结束a' 匹配一行的结束 a′匹配一行的结束a匹配所有的以a结尾的
‘.’ 匹配任意的一个字符 r…t匹配所有的r t中间有两个字母的行
‘*’ 匹配前面一个字符出现多次 o*表示o出现多次
正则表达式可以搭配使用
字符区间 [6,8] 匹配6或者8
[0-9] 匹配0-9的数
[0-9]*任意长度的数字串
[a-z]匹配a-z的字符
[a-a]*匹配任意长度的字符串
\转义字符,必需搭配单引号使用’/$’
有扩展的正则表达式,可以查阅相关资料
十一、文本处理工具
cut [选项参数] filename
选项参数可选
-f 列号
-d 分隔符
-c 按照字符切割 后面加n表示第几行
awk [选项参数] ‘/pattern/{action1} /pattern2/{action2}…’ filename
pattern:表示匹配模式
action:表示找到匹配内容以后的一系列命令
-F 指定输入文件分割符
-v 赋值一个用户定义变量