shell编程

简介: shell是一个[命令行](https://so.csdn.net/so/search?q=命令行&spm=1001.2101.3001.7020)解释器,它接收应用程序/用户命令,然后调用操作系统内核

第1章 Shell概述

  • shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核

第2章 Shell 解析器

  • linux 提供的Shell 解析器有很多,最常用的俩个解析器为:sh和bash。
  • Centos默认的解析器是bash

    [root@zjh home]# echo $SHELL
    /bin/bash

第3章 Shell脚本入门

  • 脚本格式

    脚本以#!/bin/bash 开头(指定解析器)

  • 第一个Shell 脚本:helloworld

    # 创建脚本
    [root@zjh home]# cat helloworld.sh 
    #!/bin/bash
    echo "hello zjh"
    
    # 执行脚本方式1
    [root@zjh home]# bash helloworld.sh 
    hello zjh
    
    # 执行脚本方式2
    [root@zjh home]# ./helloworld.sh
    -bash: ./helloworld.sh: 权限不够

    方式1,本质是bash解析器帮你执行脚本,所以脚本本身不需要执行权限;

    方式2,本质是脚本自己需要执行,所以需要执行权限

  • 第二个Shell 脚本:多命令处理

    需求 :在linux家目录下创建一个bangzhang.txt并在文件中写入"I IOVE YOU"字符.

    [root@zjh home]# touch batch.sh
    [root@zjh home]# vim batch.sh
    
    #!/bin/bash
    cd /home/linux/
    touch banzhang.txt
    echo "I LOVE YOU" >> banzhang.txt

第4章 Shell中的变量

4.1 系统变量

  • 常用系统变量 $HOME $PWD $SHELL $USER

    [root@zjh home]# echo $HOME
    /home/linux
    [root@zjh home]# echo $PWD
    /home/linux/datas
    [root@zjh home]# echo $SHELL
    /bin/bash
    [root@zjh home]# echo $USER
    linux

4.2自定义变量

  • 1.基本语法

    定义变量:变量=值 等号两边不能留有空格

    撤销变量:unset 变量

    输出变量:echo $变量

    声明静态变量: readonly 变量,==注意:不能unset==

    [root@zjh home]# A=1
    [root@zjh home]# echo $A
    1
    [root@zjh home]# unset A
        
    # readonly 变量,注意:不能unset
    [root@zjh home]# readonly B=2
    [root@zjh home]# echo $B
    2
        
    [root@zjh home]# B=9
    -bash : B: readonly variable
        
        
  • 2.变量定义规则

    1. 变量名称可以由字母,数字和下划线组成,不能以数字开头,==环境变量名建议大写==
    2. ==等号两侧不能有空格==
    3. 在bash中,变量默认类型都是字符串类型,无法直接进行数值运算
    4. 变量的值如果有空格,需要使用双引号或单引号括起来
[root@zjh home]# D="A B C"
[root@zjh home]# echo $D
A B C
    
[root@zjh home]# C=1+2
[root@zjh home]# echo $c
1+2

  • 可把变量提升为全局变量,可供其他shell程序使用:
    export 变量

4.3 特殊变量:$n

  • $n——n为数字,$0 代表脚本名称,10以内参数用$1-$9表示,10以上需要用大括号${10}.
#!/bin/bash
echo "$0" "$1" "$2" "$3"
[root@zjh home]# sh parameter.sh
parameter.sh
  
[root@zjh home]# sh parameter.sh 10 lal 20
parameter.sh 10 lal 20

4.4 特殊变量:$

  • $#——获取所有输入参数个数,常用于循环
[root@zjh home]# vim parameter.sh
#!/bin/bash
echo "$0" "$1" "$2"
echo $#
[root@zjh home]# bash parameter.sh
parameter.sh
0
[root@zjh home]# bash parameter.sh 10 lala 20
parameter.sh 10 lala 20
3

4.5 特殊变量:$* 和$@

  • $* ——代表命令行中所有的参数,把所有参数看成一个整体
  • $@ ——也代表命令行中所有的参数,不过把每个参数区分对待
[root@zjh home]# vim parameter.sh
echo "$0" "$1" "$2" "$3"
echo $#
echo $*
echo #@
[root@zjh home]# sh parameter.sh 1 2 3
parameter.sh 1 2 3
3
1 2 3
1 2 3

4.6 特殊变量:$?

  • $?——最后一个执行的命令的返回状态。如果这个变量的值为0,则最后一个命令正确执行

    ​ 如果这个值为非0(具体哪一个数,由命令自己来决定),则证明上一个命令执行不正确

[root@zjh home]# sh parameter.sh 1 2 3
parameter.sh 1 2 3
3
1 2 3
1 2 3
    
[root@zjh home]# $?                          执行失败返回非0
-bash:0 : command not found
[root@zjh home]#  echo $?
127
    
[root@zjh home]#  sh parameter.sh 1 2 3       执行成功返回0
parameter.sh 1 2 3
3
1 2 3
1 2 3
    
[root@zjh home]# echo $?
0

第5章 运算符

5.1 基本语法

  • $((运算式)) 或者 $[运算式]
  • expr +. -, *, /, % 加,减,乘,除,取余
    ==注意:expr运算符间要有空格==

5.2 实例实操

计算3+2的值

[root@zjh home]# expr 2 + 3
5
[root@zjh home]# expr 2+3
error

计算(2+3)x4的值

[root@zjh home]# expr `expr 2 + 3` \* 4
20
[root@zjh home]#  a=$[(2+3)*4]
[root@zjh home]#  echo $a
20

第6章条件判断

6.1基本语法

[ condition ] ==(注意 condition前后要有空格)==

注意:条件非空即为true, [atguigu] 返回 true, []返回false

6.2常用条件判断

符号 描述
-lt (less than) 小于
-le (less equal) 小于等于
-eq (equal) 等于
-gt (greater than) 大于
-ge (greater equal) 大于等于
-ne (no eqeual) 不等于
文件权限判断
  • -r 有读的权限
  • -w 有写的权限
  • -x 有执行的权限
文件类型判断
  • -f 文件存在并且是一个常规文件 (file)
  • -e 文件存在 (exixtence)
  • -d 文件存在病是一个目录 (directory)

6.3 案例实操

# 判断23是否大于2
[root@zjh home]# $ [ 23 -gt 2 ]
[root@zjh home]# echo $?
0

[root@zjh home]# $ [ 23 -le 2 ]   
[root@zjh home]# echo $?           #返回值非0说明上一条指令执行错误,也就是[ 23 -le 2 ] 
1                                  #是错误的
    
# 判断helloworld.sh是否有写入权限
[root@zjh home]#  [ -w hellowrld.sh ]
[root@zjh home]#  echo $?
0

# 判断目录中文件是否存在
[root@zjh home]#  [ -e /home/linux/datas ]
[root@zjh home]#  echo $?
0
    
    
#多条件判断
[root@zjh home]# [ condition ] && echo OK || echo notok 
OK
[root@zjh home]# [ condition ] && [] || echo notol
notok

第7章 流程控制(重点)

7.1 if语句

  • ==注意事项==:[ 条件判断 ],中括号和条件判断之间必须有空格。
  • if 后要有空格
[root@zjh home]# cat if.sh
#!/bin/bash
if [ $1 -eq 1 ]
then
    echo "我最帅"
elif [ $1 -eq 2 ]
then
    echo "我最好看"
fi
    
[root@zjh home]# bash if.sh 2
我最好看

7.2 case语句

注意事项

  • case 行尾必须为单词"in", 每一个模式匹配必须以右括号“)”结束。
  • 双分号“;;” 表示命令序列结束,相当于java中的break.
  • 最后的“*)” 表示默认模式,相当于java中的default.
[root@zjh home]# cat case.sh
#!/bin/bash
case $1 in
1)
    echo "班长"
;;
2)
    echo "学委"
;;
3)
    echo "体委"
;;
*) 
    exho "人妖"
esac
[root@zjh home]# bash case.sh 4
人妖

7.3 for循环

语法1
[root@zjh home]# cat for.sh
#!/bin/bash
s=0
for((i=1;i<=100;i++))
do
    s=$[$s+$i]    
done
echo $s
[root@zjh home]# bash for.sh
5050
语法2
[root@zjh home]# cat for2.sh
#!/bin/bash
for i in $*
do
    echo $i
done
 
for i in $@
do
    echo $j
done
    
[root@zjh home]# bash for2.sh 1 2              //看不出什么区别
1
2
1
2
[root@zjh home]# cat for2.sh
#!/bin/bash
for i in "$*"
do
    echo $i
done
 
for i in "$@"
do
    echo $j
done
    
[root@zjh home]# bash for2.sh 1 2             //能看出明显区别
1 2                                           //$* 是把输入的看成一个整体全部赋给i
1                                             //$@ 是把输入分开传送,依次循环赋给j
2

7.4 while 循环

[root@zjh home]# cat while.sh
#!/bin/bash
s=0
i=1
while [ $i -le 100 ]    //i是变量,我们这里使用的是i的值i的值为$i
do
    s=$[$s + $i]
    i=$[$i + 1]
done
echo $s

[root@zjh home]# bash while.sh
5050

第8章 read读取控制台输入

read(选项)(参数)
  • -p 指定读取值时的提示符
  • -t 指定读取值时等待的时间(秒)

参数:

变量:指定读取值得变量名

实际上就是把选项输入的值,赋给变量(参数)

# 提示7秒内,读取控制台输入的名称
[root@zjh home]# cat read.sh
#!/bin/bash
read -t 7 -p "input your name" NAME
echo $NAME
    
[root@zjh home]# bash read.sh            //如果7秒没有输入自动结束
[root@zjh home]# bash read.sh
input your name   zjh
zjh

第9章 函数

9.1 系统函数

  • basename 基本语法

    basename[string / pathname] [suffix] ——basename命令会删掉所有的前缀包括最后一个('/')字符,然后将字符串显示出来。

    选项:

    suffix 为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉

    # 方式1
    [root@zjh home]# basename /home/linux/banzhang.txt
    banzhang.txt
    
    # 方式2
    [root@zjh home]# basename /home/linux/banzhang.txt .txt
    banzhang
  • dirname基本语法

    dirname 文件绝对路径——从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)

    [root@zjh home]# dirname /home/linux/banzhang.txt
    /home/linux

9.2 自定义函数

  • #格式
    [function] funname[()]     //[function] 选择项可写,可不写
    {
        Action;
        [return int;]
    }
    funname
  • 经验技巧

    • 必须在调用函数之前,先声明函数,shell脚本是逐步运行。不会像其他语言一样先编译。
    • 函数返回值,只能通过$?系统变量获得,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255).
# DESC 计算输入两个参数的值
[root@zjh home]# cat sum.sh
#!/bin/bash
function sum(){
    s=0;
    s=$[$1 + $2]
    echo $s
}

read -p "input your sum1:" P1
read -p "input your sum2:" P2
sum $P1 $P2
    
[root@zjh home]# bash sum.sh
input your sum1:1
input your sum2:2
3

第10章 Shell工具(重点)

10.1 cut

cut命令从文件的每一行剪切字节,字符和字段并将这些字节,字符和字段输出。
cut [选项参数] filename

说明:默认分隔符是制表符

  • -f 列号,提取第几列
  • -d 分隔符,按照指定分隔符分隔列
# DESC 切割cut.txt第一列
[root@zjh home]# cat cut.txt
dong shen
guan zhen
wo wo
lai lai
le le
[root@zjh home]#cut -d " " -f 1 cut.txt
dong
guan
wo
lai
le
#在cut.txt文件中切割出guan
[root@zjh home]# cat cut.txt
dong shen
guan zhen
wo wo
lai lai
le le
[root@zjh home]# cat cut.txt | grep guan
guan zhen
[root@zjh home]# cat cut.txt | grep guan | cut -d " " -f 1
guan
#选取系统PATH变量值,第2个“:”开始后的所有路径
[root@zjh home]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/
usr/sbin:/sbin:/home/atguigu/bin

[root@zjh home]# echo $PATH | cut -d : -f 3-              //不加-表示第三列,加=表示第三列之后
/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/atguigu/bin
#切割ifconfig后打印IP地址
[root@zjh ~]# ifconfig ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet:192.168.56.137  netmask:255.255.255.0  broadcast:192.168.56.255
        inet6 fe80::5da3:53d8:5d87:598c  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:ad:3d:0f  txqueuelen 1000  (Ethernet)
        RX packets 1818  bytes 139153 (135.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 301  bytes 28358 (27.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@zjh ~]# ifconfig ens33 | grep inet
        inet:192.168.56.137  netmask:255.255.255.0  broadcast:192.168.56.255
            
[root@zjh ~]# ifconfig ens33 | grep inet | cut -d : -f 2       
192.168.56.137 netmask

[root@zjh ~]# ifconfig ens33 | grep inet | cut -d : -f 2 | cut -d " " -f 1
192.168.56.137

10.2 sed

1. 基本用法

  • sed是一种流编辑器,它一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,成为“模式空间”,接着sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕,接着处理下一行,这样不断重复,知道文件末尾,文件内容并没有改变,除非你使用重定向存储输出。

2.选项参数说明

  • sed [选项参数] ‘command’ filename

    • -e 直接在指令列模式上进行sed的动作编辑

3. 命令功能描述

  • a 新增,a的后面可以接字符串,在下一行出现
  • d 删除
  • s 查找并替换
# DESC 在第二行后增加mei nv字符
[root@zjh ~]# sed  "2a mei nv" sed.txt   //2a表示第二行
dong zhen                                //单个一个需求命令的话,不需要-e,后面再说
guan zhen
mei nv
wo wo
lai lai
#删除set.txt文件所有包含wo的行
[root@zjh ~]# sed '/wo/d' sed.txt
dong zhen                                
guan zhen

lai lai
#将sed.txt文件中wo替换为ni
[root@zjh ~]# sed  "s/wo/ni/g" sed.txt     g代表全局变量,把所有的wo替换为ni
dong zhen                               
guan zhen
ni ni
lai lai
#将sed.txt文件中的第二行删除并将wo替换成ni
[root@zjh ~]# sed -e "2d" -e "s/wo/ni/g"  sed.txt
dong zhen                               
ni ni
lai lai

10.3 awk

awk 一个强大文件分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。

awk [选项参数] 'pattern1 {action1} pattern2{action2}..' filename
  • -F 指定输入文件分隔符
  • -v 赋值一个用户定义变量

10.4 sort

sort 命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出

sort [选项] (参数)
参数 描述
-n 依照数值大小排序
-r 以相反的顺序排序
-t 设置排序时使用的分隔字符
-k 指定需要排序的列

hen

lai lai

将sed.txt文件中wo替换为ni

[root@zjh ~]# sed "s/wo/ni/g" sed.txt g代表全局变量,把所有的wo替换为ni
dong zhen
guan zhen
ni ni
lai lai

将sed.txt文件中的第二行删除并将wo替换成ni

[root@zjh ~]# sed -e "2d" -e "s/wo/ni/g" sed.txt
dong zhen
ni ni
lai lai


#### 10.3 awk

awk 一个强大文件分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。

awk [选项参数] 'pattern1 {action1} pattern2{action2}..' filename


- -F 指定输入文件分隔符
- -v 赋值一个用户定义变量

#### 10.4 sort

sort 命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出

sort [选项] (参数)


|参数|描述|
|:-:|:-:|
|-n|依照数值大小排序|
|-r|以相反的顺序排序|
|-t|设置排序时使用的分隔字符|
|-k|指定需要排序的列|
目录
相关文章
|
3月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
3月前
|
Shell Linux
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单
|
1月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
2月前
|
Shell
Shell编程(下)
Shell编程(下)
107 1
|
2月前
|
Shell Linux Windows
Shell编程(上)
Shell编程(上)
46 1
|
2月前
|
Shell Linux 开发工具
|
2月前
|
监控 Unix Shell
shell脚本编程学习
【10月更文挑战第1天】shell脚本编程
78 12
|
3月前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余
|
3月前
|
存储 Unix Shell
shell脚本编程基础
【9月更文挑战第4天】
48 12
|
3月前
|
Shell Linux
Shell 编程 编写hello word
Shell 编写hello word
55 5