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进行查看

shell 复制代码
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命令

shell 复制代码
expr 1 + 2   #返回1+2的值
expr 5 \* 2  #返回5*2的值
a=$(expr 1 + 2) #将1+2的值赋值给a
a='expr 1 + 2'  #将1+2的值赋值给a

(())或者是(())或者是(())或者是[]

shell 复制代码
$((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语言运算了。 ```shell let i+=1 let i++ #注意符号两边不要加空格 ``` #### 7.1 if判断 单分支: ```shell if [ condition ];then #程序 fi if [condition] then #程序 fi ``` 多分支: ```shell if [ condition ] then #程序1 elif[ condition ] then #程序2 else #程序3 fi if [ condition ];then #程序1 elif[ condition ];then #程序2 else #程序3 fi ``` 只有if以后需要加上then,else后面不需要加then 对于if判断,同样可以使用逻辑或\|\|或者是逻辑与\&\& **在同一个括号中进行逻辑与是-a, 逻辑或是 -o** #### 7.2 case语句 ```shell case $变量名 in "值1") ;; "值2") ;; #其他分支 *) #默认分支 ;; esac #结束标志 ``` #### 7.3 for循环 ```shell for ((初始值;循环控制条件;变量变化)) do #程序 done #示例 一个求和脚本 #!/bin/bash echo "请输入一个数字" read number sum=0 for((i=1;i<=$number;i++)) do sum=$(($sum+$i)) done echo $sum for 变量 in 序列 do #程序 done //例程 for os in linux windows macos; do echo $os done for i in {1..100} do echo $i done ``` #### 7.4 while循环 ```shell while [ condition ] do #程序 done ``` #### 7.5 read读取控制台输入 ```shell read (选项) (参数) ``` 选项: ​ -p :指定读取值时的提示符 ​ -t:指定读取值时的等待时间,如果不加-t的话移植等待。 ```shell read -t 7 -p "please enter you name:" name #等待7秒,并输出提示符"please enter you name:" ``` ### 八、函数 ​ 函数就是能够实现某种方法的指令集合。 #### 8.1系统函数 一些常用的系统函数,持续更新... ```sh date #获取当时系统时间 date +%s #获取当前系统时间戳 basename[string/pathname][suffix] #取路径中文件的名称 会将suffix的后缀去掉,前面是pathname 截取当前路径最后一个斜杠之后的字符串 #获取当前文件的路径名称 截取最后一个斜杠之前的命令 通常搭配pwd使用 dirname ``` #### 8.2自定义函数 在调用函数之前,必须要声明函数。因为shell脚本是逐行运行,不会像其他语言一样先编译。 函数返回值**只能通过$?系统变量获取** ```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 ``` ### 九、综合应用 ```shell #!/bin/bash #判断输入参数是否为1 if [ $# -ne 1 ] then echo "参数个数错误!应该输入一个参数,作为归档目录名" exit fi #从参数中获取目录名称 if [ -d $1 ] then echo else echo echo "目录不存在" echo exit fi DIR_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_NAME if [ $? -eq 0 ] then echo echo "归档成功" echo "归档文件为:$DESt" echo else echo "归档出现问题" 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 赋值一个用户定义变量

相关推荐
努力学习的小廉3 小时前
深入了解linux网络—— TCP网络通信(下)
linux·网络·tcp/ip
Lu Zelin9 小时前
单片机为什么不能跑Linux
linux·单片机·嵌入式硬件
CS Beginner10 小时前
【Linux】 Ubuntu 开发环境极速搭建
linux·运维·ubuntu
ajassi200010 小时前
开源 C++ QT QML 开发(二)工程结构
linux·qt·qml
今天只学一颗糖11 小时前
Linux学习笔记--insmod 命令
linux·笔记·学习
摩羯座-1856903059411 小时前
爬坑 10 年!京东店铺全量商品接口实战开发:从分页优化、SKU 关联到数据完整性闭环
linux·网络·数据库·windows·爬虫·python
irisart12 小时前
4.1 > Linux 文件/目录权限管理【理论】
linux
---学无止境---12 小时前
Linux中poll的实现
linux
爱倒腾的老唐13 小时前
13、Linux 基本权限
linux·运维·服务器