shell脚本编程第一章

1、什么是shell

shell相当于一个翻译,把我们在计算机上执行的操作和命令,翻译成计算机可以识别的二进制命令,然后传递给内核,以便计算机硬件去执行操作,计算机执行完成后,再通过shell翻译成自然语言,呈现给用户。

img

shell收到命令后,首先检查是不是内部命令,如果不是的话再去检查是否为某个应用程序,这里的应用程序可以是Linux本身的实用程序,比如“ls、rm”,然后shell会通过控制变量“$PATH”去寻找命令,环境变量$PATH是一个存放可执行程序的目录,如果键入的命令不是内部命令也不是应用程序的命令(或者说找不到执行命令的路径),会返回一个报错。如果可以找到,shell会将命令分解为系统调用并且传给Linux内核。

[root@server ~]# kkksada
bash: kkksada: 未找到命令... ##这就表示找不到命令

2、Linux的常用解释器

  • Bash

    bash(GNU Bourne-Again Shell)是最常用的一种shell,是当前大多数Linux发行版的默认Shell。

    bash的全名是Bourne Again Shell。最开始在Unix系统中流行的是sh,而bash作为sh的改进版本,提供了更加丰富的功能。一般来说,都推荐使用bash作为默认的Shell。

    bash 与 Bourne shell(sh) 完全向后兼容,并且在 Bourne shell 的基础上增加和增强了很多特性。bash 也包含了很多 C 和 Korn shell 里的优点。bash 有很灵活和强大的编程接口,同时又有很友好的用户界面。

    bash的优点:支持tab补全、支持快捷键、查询历史命令、支持别名、管道、重定向

  • 其他解释器

    其他的shell还有 sh、ksh、rsh、csh

3、什么是Shell脚本

Sehll脚本是一种编程语言脚本,它是一系列命令的集合,保存在一个文件中,可以用.sh文件后缀来提示为shell脚本文件。通过运行这个脚本文件来执行里面的命令。

4、Shell脚本的编写规范

  • 声明解释器

    在shell文件开头通过“#!"来声明该脚本通过何种shell来执执行文件中的命令

    #!/bin/bash ##使用bash来解释,也是最常用的声明方式
    
  • 单行注释

    在shell脚本中,注释通过#字符实现,任何#后面的内容不会被执行。

    # this is exegesis
    #hello world
    
  • 编写命令

    撰写解释器可以理解的命令

    #! /bin/bash
    #shell 脚本测试
    mkdir /opt/test
    cd /opt/test
    echo  test > 123.txt
    

4、Shell脚本的执行方式

  • 给文件赋予x(执行)权限,通过相对、绝对路径执行

    chmod U+x test.sh
    ./test.sh(相对路径) 或 /opt/test.sh
    

    此时执行的逻辑:用户(root)---bash(目前系统的shell)---bash(shell脚本声明的shell)---执行命令。执行结束后退出脚本的shell。此时的环境为用户(root)---bash。

  • 使用解释器程序去执行脚本,无需x权限

    bash test01.sh 
    

    通过该命令执行,会使用bash命令权限去对文件执行。执行逻辑:

    用户(root)---bash(目前系统的shell)---bash(命令声明的解释器)---执行命令

  • 使用source或者.执行脚本,无需x权限

    source test01.sh
    

    执行逻辑:用户(root)---bash(目前系统的shell)--命令

    这种执行方式不再调用解释器,直接使用系统的自身的解释器。(不开子进程)

5、shell脚本案例

  • 编写搭建yum脚本

    #!bin/bash
    #yum搭建脚本
    mv /etc/yum.repos.d/*.repo /opt/data
    echo "[test]
    name=test
    baseurl=http://192.168.2.1/yum
    enabled=1
    gpgcheck=0" > /etc/yum.repos.d/sehllyum.repo
    
  • 创建http服务,并且显示页面为hello world

    #!bin/bash
    #搭建http服务
    yum -y install httpd
    systemctl restart httpd
    cd /var/www/html
    echo "hell word" > index.html
    
  • 编写脚本,安装ftp服务并开启且设置为开机自启

    #bin/bash
    #搭建ftp服务
    yum -y install vsftpd
    systemctl restart vsftpd
    systemctl enable vsftpd
    systemctl status vsftpd
    

    6、变量

    再shell中,变量的定义不需要使用数据类型,可以直接用”=“赋值,”=“两边不要有空格,变量的值可以直接通过$符合来应用

    a=10
    echo $a
    
  • 变量的命名规则

    • 变量名只能包含字母、数字、下划线
    • 不能以数字开头
    • 变量名通常用大写字母提高可读性(非强制)
  • 变量赋值方式

    变量名称=值

    a=10 #创建变量a,赋值10
    a=20 #再次给a赋值,之前的会被覆盖
    echo $a #调用变量a
    unset a #取消变量的定义,也可以用a= ,给a赋空值
    
  • 环境变量

    环境变量是可以在整个系统中使用的变量,通常再shell会话就可以定义,可以影响整个系统的行为和操作,常见的环境变量有:

    USER 当前用户名 UID当前用户的id号 HOME当前用户家目录

    HOSTNAME 主机名 SHELL当前用户的解释器 PWD当前位置

    PATH 存储命令的路径 PS1 一级提示符 PS2 二级提示符

    printenv #查看所有环境变量
    
  • 位置变量和预定义变量

    • $0:当前脚本的文件名。

    • $1, $2, ...:传递给脚本或函数的参数。

      #!/bin/bash
      echo "push $1 $2 $3"
      

      运行结果

      [root@server opt]# sh shell.sh 10 20 30
      push 10 20 30
      
    • $#:传递给脚本或函数的参数个数。

      例:

      #!/bin/bash
      echo push $1 $2 $3 $#
      

      运行结果

      [root@server opt]# sh shell.sh 10 20 30
      push 10 20 30 3
      
    • $@:传递给脚本或函数的所有参数。

    • $?:上个命令的执行结果,执行成功为0,不成功为其他数字

    • $$:当前 Shell 进程的 PID。

    • $!:后台运行的最后一个进程的 PID。

      例:

      #!/bin/bash
      echo push $1 $2 $3 $# $@ $? $$ $!
      

      运行结果

      [root@server opt]# sh shell.sh 10 20 30
      push 10 20 30 3 10 20 30 0 16234
      
  • 变量相关符号

    • 双引号” “

      ” “用于定义一段字符串,在字符串中可以允许调用变量,输出变量所赋予的值。

      示例

      [root@server opt]# name=xiaobai
      [root@server opt]# echo "hello $name"
      hello xiaobai
      
    • 单引号

      ‘ ’用于定义一段字符串,在字符串中不会解析变量和命令替换。单引号内的内容会被完全保留,包括变量和特殊字符。

      示例

      name="Kimi"
      echo 'Hello, $name!'  # 输出:Hello, $name!
      
  • 交互变量

    利用read命令可以读取键盘输入的内容,然后赋值给指定的变量,read命令格式为

    read [变量]
    read -p "可以在这里写需要提示给用户的内容" [变量]
    
    • 创建用户且设置密码脚本

      #/bin/bash
      read -p "请输入用户名" u
      useradd $u
      stty -echo #不展示键盘输入的内容
      read -p "请输入密码" p
      stty -echo
      echo "$p" | passwd --stdin $u 
      

7、Linux数学运算

  • expr命令

    可以使用expr命令实现加减乘除以及求模运输(取余)

    [root@server opt]# expr 1 + 1 ##运算符号中间要有空格
    2
    [root@server opt]# expr 2 '*' 2 ## *在Linux存在代表所有的意思,需要通过''或\符号进行转义
    4
    [root@server opt]# expr 2 - 2
    0
    [root@server opt]# expr 2 / 2
    1
    [root@server opt]# expr 2 % 2
    0
    

    变量可以配合expr命令使用

    a=10 b=20
    expr $a + $b
    
  • $[ ]运算

    [root@server opt]# echo $[2*2]
    4
    [root@server opt]# echo $[2+2]
    4
    [root@server opt]# echo $[2-2]
    0
    [root@server opt]# echo $[2/2]
    1
    [root@server opt]# echo $[2%2]
    0
    
  • let命令,不直接输出结果,专用于变量的创建或变量自增减

    let a=1+1 #创建变量,并且将计算结果赋值给a
    
    • 变量的自增减

      let a=a+1 let a++ 变量a加1

      let a=a-1 let a-- 变量a减1

      let a=a+10 let a+=10 变量a加10

      let a=a-10 let a-=10 变量a减10

      let a=a2 let a=2 变量a乘以2

      let a=a/2 let a/=2 变量a除以2

      let a=a%3 let a%=3 变量a除以3取余数

  • bc可以用于计算小数

    [root@server opt]# echo "1+1.1" | bc  
    2.1
    

    可以定义小数位数

    [root@server opt]# echo "scale=2;10/3" | bc
    3.33
    
posted @ 2025-03-02 22:38  Epiphany(qrx)  阅读(21)  评论(0)    收藏  举报