• 【linux基础】 4.1 简单shell编程语法


    本章节来看看简单的shell编程

    shell脚本

    执行和格式

    • 脚本格式要求
    1. 脚本要以#!/bin/bash开头
    2. 脚本要有可执行权限

    脚本的常用执行方式:

    方式1(输入脚本的绝对路径或相对路径)
    说明:首先要赋予helloworld.sh脚本的+x权限,再执行脚本
    方式2 (sh + 脚本)
    说明:不用赋予脚本+x权限,直接执行即可

    Shell变量

    系统变量

    $HOME  $PWD  $SHELL $USER等等
    
    • 1

    运行set可以看到当前shell中所有变量

    自定义变量

    • 定义: 变量名=值
    • 定义规则

    变量名称可以由字母、数字、下划线组成,但不能是数字开头
    等号两边不能有空格
    变量名称一般习惯大写,规范

    • 撤销变量: unset 变量
    • 声明静态变量: readonly,静态变量不能unset
    • 输出变量需要 $变量名
    • 将命令返回值赋给变量

    A=‘date’ 或
    A=$(date)

    设置环境变量即全局变量

    export 变量名=变量值     (让shell变量输出为环境变量/全局变量)
    source 配置文件           (让修改后的配置信息立即生效)
    echo $变量名              (查询环境变量的值)
    
    • 1
    • 2
    • 3
    • shell脚本单行和多行注释
    # 单行注释
    :<<! 
    多行注释内容
    多行注释内容
    多行注释内容 
    ! 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    获取命令行的参数(位置参数)

    • 就是想让sh脚本获取的用户输入的变量
      当我们执行脚本时,希望获取到命令行参数信息比如:./myshell.sh 100 200,就可以在脚本中获取到参数信息
    $n  (n为数字,$0代表命令本身, $1-$9代表第一到第九个参数,十个以上的参数需要用大括号表示如 ${100})
    $* (把所有命令行参数看成整体)
    $@ (也代表命令行所有参数,不过把参数区分对待)
    $# (代表命令行中所有参数个数)
    
    • 1
    • 2
    • 3
    • 4

    预定义变量

    是shell设计者(官方人员)事先定义的变量,可以直接使用

    $$  (当前进程的进程号(PID))
    $!  (后台运行的最后一个进程的进程号(PID))
    $?  (最后一次执行的命令的返回状态。如果这个值为0,证明上一个命令正确执行,如果非0(具体哪个数)由命令自己决定,则证明上一个命令执行不正确了)
    
    • 1
    • 2
    • 3

    运算符

    基本语法:

    1. "$((运算式))""$[运算式]"expr m + n  (expression表达式,写法2. 奇怪)
    3. expr运算符间有空格
    4. expr m - n
    5. 要把得到的结果赋值需要用反引号引起来,例A=' expr 2 + 3 '
    6. expr \*  /   %    乘   除以   取余
    
    • 1
    • 2
    • 3
    • 4
    • 5

    expr真的有点麻烦,还得分步走,我还是选一二方法,尽量2吧。

    条件判断

    条件前后是由空格的,非空为真,0为true,>1为false

    [ 条件 ]
    [ 条件 ] && echo OK || echo notok      ···条件满足,执行后边的语句,运算符是且和或
    
    • 1
    • 2

    判断语句

    判断条件
    在这里插入图片描述

    流程控制

    if语句

    if [条件判断式];then
    程序
    或者
    if [条件判断式]
    then
    程序
    elif [条件判断式]
    then
    程序
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    case语句

    如果变量值=值1,执行程序1
    如果变量值=值2,执行程序2

    都没有则执行最后一个

    case $变量名 in
    "值1" )
    程序1
    ;;
    "值2" )
    程序2
    ;;
    #省略其他分支
    *)
    如果都不是以上的值,执行此程序
    ;;
    esac
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    for循环

    • 语法1:
    for 变量 in 值1 值2 值3...
    do
    程序
    done
    
    • 1
    • 2
    • 3
    • 4
    • 语法2:
    for ((初始值;循环控制条件;变量变化))
    do
    程序
    done
    
    • 1
    • 2
    • 3
    • 4

    while循环

    记得有空格

    while [ 条件判断式 ]
    do
    程序
    done
    
    • 1
    • 2
    • 3
    • 4

    read动态读取控制台输入

    read (选项)(参数)
    -p : 指定读取值时的提示符
    -t: 指定读取值的等待时间,超时则不等待
    参数
    变量:指定读取值的变量名
    
    • 1
    • 2
    • 3
    • 4
    • 5

    举例,运行如下程序,系统一直等待系统输入(回车结束)

    read -p "请输入您的数字" A
    
    • 1

    函数

    系统函数

    举例basename:
    basename基本语法:
    功能:返回完整路径最后的/部分,常用于获取文件名

    basename [pathname][suffix]    ···basename命令会删掉所有前缀包括最后一个'/'字符,最后将字串显示出来
    basename /home/aaa/test.txt   ···运行后会返回test.txt
    
    • 1
    • 2

    举例dirname:
    返回完整路径/的前面部分,常用于获取路径

    dir 文件绝对路径
    
    • 1

    自定义函数

    基本语法:

    [ function ] funname[()]
    {
    	Action;
    	[return int;]
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    调用直接写函数名
    举例:
    此类参数选择动态获取

    function getsum()
    {
    	SUM=$[$n1+$n2]
    	echo "和是=$SUM"
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 相关阅读:
    linux命令汇总
    私有化轻量级持续集成部署方案--02-Nginx网关服务
    【STL】:list的模拟实现
    仿大众点评——秒杀系统部分02
    安卓开发调用摄像头问题
    计算机网络 网络层设备的 冲突域和广播域
    吴恩达机器学习-1
    【百度地图】绘制扇形图层
    【笔记】ABAQUS弹塑性分析
    Kafka、RocketMQ、RabbitMQ的比较总结Kafka、RocketMQ、RabbitMQ的比较总结
  • 原文地址:https://blog.csdn.net/Eric_Sober/article/details/126060579