Linux基础—5.Shell基础编程【有图有真相】


Linux基础传送门:


1.什么是Shell程序?

  1. 以文件形式存放批量的Linux命令集合,该文件能够被Shell解释执行,这种文件就是Shell脚本程序。
  2. 通常由一段Linux命令、Shell命令、控制语句以及注释语句构成
  3. Shell脚本的编写。
    Shell脚本是纯文本文件,可以使用任何文本编辑器编写Shell脚本,通常是以.sh 作为后缀名。

2. Shell编程中变量的声明、引用及作用域

  1. Shell程序的第一行:用来指定用哪个程序来编译和执行脚本。
    #!/bin/bash或者#!/bin/sh,sh是bash程序的软连接。这里的#不是注释,是特殊命令。

  2. 变量命名
    变量名必须以字母或下划线开头,后面可以跟字母、数字或下划线。任何其它字符都标志变量名的结束。变量名关于大小写敏感。通过$符号来引用变量名。
    在这里插入图片描述

  3. 变量类型
    根据变量的作用域,变量可以分为本地变量和环境变量。而环境变量又分root用户的环境变量与某个用户的环境变量。root用户的环境变量设置在/etc/profile文件下,某个用户的环境变量设置在/home/swpu/.bash_profile文件中。

    [swpu@centos ~]$ ll -al
    total 28
    drwx------. 2 swpu swpu 4096 May 18 22:26 .
    drwxr-xr-x. 3 root root 4096 May 18 20:44 ..
    -rw-------. 1 swpu swpu   51 May 18 21:11 .bash_history
    -rw-r--r--. 1 swpu swpu   18 Mar 23  2017 .bash_logout
    -rw-r--r--. 1 swpu swpu  176 Mar 23  2017 .bash_profile
    -rw-r--r--. 1 swpu swpu  124 Mar 23  2017 .bashrc
    -rw-rw-r--  1 swpu swpu    0 May 18 22:26 dis.sh
    -rw-rw-r--  1 swpu swpu  240 May 18 21:36 lj-log.txt
    [swpu@centos ~]$ vi .bash_profile
    
    # .bash_profile
    
    # Get the aliases and functions
    if [ -f ~/.bashrc ]; then
            . ~/.bashrc
    fi
    
    # User specific environment and startup programs
    
    PATH=$PATH:$HOME/bin
    
    export PATH
    
    # 添加用户环境变量
    export NAME_TEST=liujie
    

    保存后;

    [swpu@centos ~]$ source .bash_profile
    [swpu@centos ~]$ echo $NAME_TEST
    liujie
    

    在这里插入图片描述
    本地变量只在创建它们的 shell程序中可用。而环境变量则在Shell中的所有用户进程中可用,通常也称为全局变量。

  4. 变量赋值
    等号两边不能有空格
    如果要给变量赋空值,可以在等号后面跟一个换行符

  5. 显示变量的值的命令:echo $variable或者echo ${variable}

  6. 清除变量的值的命令:unset variable

  7. 显示当前用户的所有变量命令:set

  8. 环境变量称为全局变量,按照惯例,需要大写:export LANG
    注意:可被所有的Shell环境下访问;
    如果父Shell进程产生了子Shell进程,则环境变量可被“继承”并复制

3.Shell编程中位置参量使用和命令执行状态码

  1. 位置参量
    位置参量是一组特殊的内置变量,通常被shell脚本用来从命令行接受参数,或被函数用来保存传递给它的参数。
    执行shell脚本时,用户可以通过命令行向脚本传递信息,跟在脚本名后面的用空格隔开的每个字符串都称为位置参量。
    位置参量有空格,需要用引号引起来!!!

    在脚本中使用这些参数时,需通过位置参量来引用。例如:$1表示第一个参数,$2表示第二个参数,以此类推.$9以后需要用花括号把数字括起来,如第10个位置参量以${10}的方式来访问。位置参量列表如下:
    在这里插入图片描述
    下面展示一下位置参量的使用!!!

    [swpu@centos ~]$ mkdir script
    [swpu@centos ~]$ cd script/
    [swpu@centos script]$ ls
    [swpu@centos script]$ touch test.sh
    [swpu@centos script]$ vi test.sh
    
    在Notepad++中编写并保存
    

    在这里插入图片描述

    然后,赋予脚本执行权限
    
    	[swpu@centos script]$ chmod u+x test.sh 
    	[swpu@centos script]$ ll
    	total 4
    	-rwxrw-r-- 1 swpu swpu 32 May 18 23:28 test.sh
    
    最后,执行脚本
    
    	[swpu@centos script]$ sh test.sh 
    	Hello Shell
    
    在脚本中使用位置参数,
    

    在这里插入图片描述

    [swpu@centos script]$ ./test.sh liujie liuyang tanhaotian
    Hello liujie - liuyang - tanhaotian !!!
    [swpu@centos script]$ sh test.sh liujie liuyang tanhaotian
    Hello liujie - liuyang - tanhaotian !!!
    
    继续在脚本中使用位置参数,	
    

    在这里插入图片描述

    [swpu@centos script]$ ./test.sh liujie liuyang tanhaotian
    Hello liujie - liuyang - tanhaotian !!!
    ======================
    ./test.sh
    [swpu@centos script]$ sh test.sh liujie liuyang tanhaotian
    Hello liujie - liuyang - tanhaotian !!!
    ======================
    test.sh
    [swpu@centos script]$ . test.sh liujie liuyang tanhaotian
    Hello liujie - liuyang - tanhaotian !!!
    ======================
    -bash
    
    我们可以发现,不同的执行脚本方式,所使用的脚本不同。
    增加显示位置参量个数的位置参量
    

    在这里插入图片描述

    ```python
    [swpu@centos script]$ sh test.sh 
    Hello  -  -  !!!
    ======================
    test.sh
    0
    [swpu@centos script]$ sh test.sh liujie liuyang tanhaotian
    Hello liujie - liuyang - tanhaotian !!!
    ======================
    test.sh
    3
    ```
    单字符串显示所有位置参量
    

    在这里插入图片描述

    [swpu@centos script]$ sh test.sh liujie liuyang tanhaotian
    Hello liujie - liuyang - tanhaotian !!!
    ======================
    test.sh
    ======================
    3
    ======================
    liujie liuyang tanhaotian
    
    `#?`显示前面一个命令退出的状态码,0表示没有错误,其他任何值都表示有错误!
    
    	[swpu@centos script]$ cd test
    	-bash: cd: test: No such file or directory
    	[swpu@centos script]$ echo $?
    	1
    
    [swpu@centos script]$ sh test.sh 
    Hello  -  -  !!!
    ======================
    test.sh
    ======================
    0
    ======================
    
    [swpu@centos script]$ echo $?
    0
    
  2. 命令执行状态码
    任何命令进行时都将返回一个退出状态。应用中通常会在关键步骤后判定#?,已确定关键步骤的执行是否正常。尤其调度系统里需要监控sh返回码。shell脚本的返回码取决于最后一个命令的返回码!

    退出状态0成功,无错误。
    退出状态大于0,失败,某处有错误。

    查看命令执行状态码命令:echo $?

4.Shell编程中数组、data和cal命令

4.1 数组

数组的定义:

[swpu@centos ~]$ arr=(zhangsan lisi wangwu)

引用数组中的变量:

[swpu@centos ~]$ echo ${arr[0]}
zhangsan

引用数组中的个数:

[swpu@centos ~]$ echo ${#arr[*]}
3

引用数组中所有元素:

[swpu@centos ~]$ echo ${arr[*]}
zhangsan lisi wangwu

为数组赋值:

[swpu@centos ~]$ arr[0]=liujie
[swpu@centos ~]$ echo ${arr[*]}
liujie lisi wangwu
4.2 date指令

查看Linux系统的时间:

[swpu@centos ~]$ date
Wed May 19 01:59:49 CST 2021

date指令的格式化输出功能:

[swpu@centos ~]$ date +%Y/%m/%d
2021/05/19
[swpu@centos ~]$ date +%H:%M
02:01
[swpu@centos ~]$ date +%H:%M:%S
02:02:50
[swpu@centos ~]$ date +%Y/%m/%dT%H:%M:%S
2021/05/19T02:04:03

在这里插入图片描述

[swpu@centos script]$ sh test.sh
2021/05/19T02:13:03
2021/05/18T02:13:03
2021/05/20T02:13:03
4.3 cal指令

查看当前月份的日历:

[swpu@centos script]$ cal
      May 2021      
Su Mo Tu We Th Fr Sa
                   1
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31

查看某一年的日历:

[swpu@centos script]$ cal 2021
                               2021                               

       January               February                 March       
Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa
                1  2       1  2  3  4  5  6       1  2  3  4  5  6
 3  4  5  6  7  8  9    7  8  9 10 11 12 13    7  8  9 10 11 12 13
10 11 12 13 14 15 16   14 15 16 17 18 19 20   14 15 16 17 18 19 20
17 18 19 20 21 22 23   21 22 23 24 25 26 27   21 22 23 24 25 26 27
24 25 26 27 28 29 30   28                     28 29 30 31
31
        April                   May                   June        
Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa
             1  2  3                      1          1  2  3  4  5
 4  5  6  7  8  9 10    2  3  4  5  6  7  8    6  7  8  9 10 11 12
11 12 13 14 15 16 17    9 10 11 12 13 14 15   13 14 15 16 17 18 19
18 19 20 21 22 23 24   16 17 18 19 20 21 22   20 21 22 23 24 25 26
25 26 27 28 29 30      23 24 25 26 27 28 29   27 28 29 30
                       30 31
        July                  August                September     
Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa
             1  2  3    1  2  3  4  5  6  7             1  2  3  4
 4  5  6  7  8  9 10    8  9 10 11 12 13 14    5  6  7  8  9 10 11
11 12 13 14 15 16 17   15 16 17 18 19 20 21   12 13 14 15 16 17 18
18 19 20 21 22 23 24   22 23 24 25 26 27 28   19 20 21 22 23 24 25
25 26 27 28 29 30 31   29 30 31               26 27 28 29 30

       October               November               December      
Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa
                1  2       1  2  3  4  5  6             1  2  3  4
 3  4  5  6  7  8  9    7  8  9 10 11 12 13    5  6  7  8  9 10 11
10 11 12 13 14 15 16   14 15 16 17 18 19 20   12 13 14 15 16 17 18
17 18 19 20 21 22 23   21 22 23 24 25 26 27   19 20 21 22 23 24 25
24 25 26 27 28 29 30   28 29 30               26 27 28 29 30 31
31

查看某一年某一月的日历:cal [month] [year]

[swpu@centos script]$ cal 5 2021
      May 2021      
Su Mo Tu We Th Fr Sa
                   1
 2  3  4  5  6  7  8
 9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31

5. Shell编程中判断表达式以及if语句使用

5.1 判断表达式
  1. 关于某个文件的【文件类型】判断,如test -e filename表示存在否

    -e:查看该文件是否存在?
    -f:查看该文件是否存在且为文件?
    -d:查看该文件是否存在且为目录?

  2. 关于文件的权限判断,如test -r filename表示是否具有可读权限

    -r:查看该文件是否存在且具有【可读】权限?
    -w:查看该文件是否存在且具有【可写】权限?
    -x:查看该文件是否存在且具有【可执行】权限?

  3. 判断两个整数之间的关系,例如test n1 -eq n2

    -eq:两数值相等
    -ne:两数值不等
    -gt:n1大于n2
    -lt:n1小于n2
    -ge:n1大于等于n2
    -le:n1小于等于n2

  4. 判断字符串数据

    test -z string:表示判断字符串是否为空?若string为空字符串,则为true
    test -n string:表示字符串是否为非空?若string为空字符串,则为false
    test str1=str2:判断str1是否等于str2,若相等,则回传true
    test str1 != str2判断str1是否不等于str2,若相等,则回传false

  5. 利用判断符号中括号来进行数据判断
    如果要在bash 的语法当中使用中括号作为 shell的判断式时,必须要注意中括号的两端需要有空格符来分隔

    [swpu@centos script]$ [ -z "$swpu" ];echo "===="
    ====
    
5.2 if判断语句
  1. 一重判断

    if[条件判断式];then
    	当条件判断式成立时,可以进行的指令工作内容;
    fi<==if反过来写,就成为fi啦!结束if之意!
    

    如果有多个条件要进行判断时,一种方法是将多个条件写入到一个中括号;另一个方法是用多个中括号,括号与括号之间以&&||来隔开。

    • &&代表AND
    • ||代表OR
  2. 多重、复杂条件判断
    在同一个数据的判断中,如果该数据需要进行多种不同的判断时,应该怎么作?

    # —个条件判断,分成功进行与失败进行(else)
    if [条件判断式]; then
    	当条件判断式成立时,可以进行的指令工作内容方
    else
    	当条件判断式不成立时,可以进行的指令工作内容;
    fi
    
    #多个条件判断(lif... elif ... elif ... else)分多种不同情况执行
    if[条件判断式一; then
    	当条件判断式一成立时,可以进行的指令工作内容;
    elif[条件判断式二; then
    	当条件判断式二成立时,可以进行的指令工作内容;
    else
    	当条件判断式一与二均不成立时,可以进行的指令工作内容;
    fi
    

6.Shell编程中的for循环、while循环

6.1 for循环
for var in con1 con2 con3 ...
do
	程序段
done

以上面的例子来说,这个Svar的变量内容在循环工作时:
1.第一次循环时,$var的内容为con1 ;
2.第二次循环时,$var 的内容为con2 ;
3.第三次循环时,$var的内容为con3 ;
4…
在这里插入图片描述
执行这个脚本时,

[swpu@centos script]$ sh test.sh 
liujie
liuyang
tanhaotian

在这里插入图片描述

[swpu@centos script]$ sh test.sh 
liujie
liuyang
tanhaotian
------------------
45
6.2 while循环

  while的中文是当…时,所以,这种方式说的是当condition条件成立时,就进行循环,直到condition 的条件不成立才停止的意思。

while [ condition ]  <==中括号内的状态就是判断式
do	<==do是循环的开始!
	程序段落
done	<==done是循环的结束

下面脚本可以实现:从文件或命令中逐行读取

cat filename | while read line
do
	echo $line
done

如果对您有帮助,麻烦点赞关注,这真的对我很重要!!!如果需要互关,请评论或者私信!
在这里插入图片描述


  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值