Shell编程——弱数据类型的脚本语言快速入门指南

news2024/11/19 1:25:42

目录

Linux Shell

数据类型

变量类型

运算符

算术运算符

赋值运算符

拼接运算符

比较运算符

关系运算符

控制结构

顺序结构

条件分支结构

if 条件语句

case 分支语句 

循环结构

for 循环

while 循环

until 循环

break 语句

continue语句

函数

函数定义 

函数名

函数体

返回值

参数

函数的局部性

简单函数示例

函数的递归

实例操作

数组遍历操作

九九乘法表


基本上,每一门编程语言,都能从数据类型、变量、运算符、控制结构、函数五个方面着手,初步掌握这些内容就可以快速入门为一名初级程序员。

Linux Shell

Shell是Linux命令行解释器,主要用于执行操作系统命令和脚本。Linux Shell编程语言是一种用于与操作系统内核进行交互的命令行脚本语言,属于解释型、弱类型的动态语言。

数据类型

bool、数字、字符串、数组

变量类型

环境变量、用户变量、全局变量、只读变量

set let export readonly  env

运算符

算术运算符

+ - * / %

赋值运算符

=,没有+=、-=、*=、/=这类复合赋值

拼接运算符

+= ,只能用于字符串的拼接

比较运算符

==、!=

关系运算符

-eq    检测两个数是否相等,相等返回 true。
-ne    检测两个数是否不相等,不相等返回 true。
-gt    检测左边的数是否大于右边的,如果是,则返回 true。
-lt    检测左边的数是否小于右边的,如果是,则返回 true。
-ge    检测左边的数是否大于等于右边的,如果是,则返回 true。
-le    检测左边的数是否小于等于右边的,如果是,则返回 true。

控制结构

顺序结构

顺序结构是最简单的算法结构,语句与语句之间是按从上到下的顺序进行的,它是由若干个依次执行的处理步骤组成的。

注:同一行可以有多个语句,只要用分号“;”来分隔即可。

条件分支结构

if 条件语句

可以细分为 if , if-else , if-elif-else 多种形式

hann@HannYang:~$ help -m if
NAME
    if - Execute commands based on conditional.

SYNOPSIS
    if COMMANDS; then COMMANDS; [ elif COMMANDS; then COMMANDS; ]... [ else COMMANDS; ] fi

DESCRIPTION
    Execute commands based on conditional.

    The `if COMMANDS' list is executed.  If its exit status is zero, then the
    `then COMMANDS' list is executed.  Otherwise, each `elif COMMANDS' list is
    executed in turn, and if its exit status is zero, the corresponding
    `then COMMANDS' list is executed and the if command completes.  Otherwise,
    the `else COMMANDS' list is executed, if present.  The exit status of the
    entire construct is the exit status of the last command executed, or zero
    if no condition tested true.

    Exit Status:
    Returns the status of the last command executed.

......

case 分支语句 

hann@HannYang:~$ help -m case
NAME
    case - Execute commands based on pattern matching.

SYNOPSIS
    case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;]... esac

DESCRIPTION
    Execute commands based on pattern matching.

    Selectively execute COMMANDS based upon WORD matching PATTERN.  The
    `|' is used to separate multiple patterns.

    Exit Status:
    Returns the status of the last command executed.

......

循环结构

for 循环

hann@HannYang:~$ help -m for
NAME
    for - Execute commands for each member in a list.

SYNOPSIS
    for NAME [in WORDS ... ] ; do COMMANDS; done

DESCRIPTION
    Execute commands for each member in a list.

    The `for' loop executes a sequence of commands for each member in a
    list of items.  If `in WORDS ...;' is not present, then `in "$@"' is
    assumed.  For each element in WORDS, NAME is set to that element, and
    the COMMANDS are executed.

    Exit Status:
    Returns the status of the last command executed.

......

while 循环

hann@HannYang:~$ help -m while
NAME
    while - Execute commands as long as a test succeeds.

SYNOPSIS
    while COMMANDS; do COMMANDS; done

DESCRIPTION
    Execute commands as long as a test succeeds.

    Expand and execute COMMANDS as long as the final command in the
    `while' COMMANDS has an exit status of zero.

    Exit Status:
    Returns the status of the last command executed.

......

until 循环

hann@HannYang:~$ help -m until
NAME
    until - Execute commands as long as a test does not succeed.

SYNOPSIS
    until COMMANDS; do COMMANDS; done

DESCRIPTION
    Execute commands as long as a test does not succeed.

    Expand and execute COMMANDS as long as the final command in the
    `until' COMMANDS has an exit status which is not zero.

    Exit Status:
    Returns the status of the last command executed.

......

break 语句

hann@HannYang:~$ help -m break
NAME
    break - Exit for, while, or until loops.

SYNOPSIS
    break [n]

DESCRIPTION
    Exit for, while, or until loops.

    Exit a FOR, WHILE or UNTIL loop.  If N is specified, break N enclosing
    loops.

    Exit Status:
    The exit status is 0 unless N is not greater than or equal to 1.

......

continue语句

hann@HannYang:~$ help -m continue
NAME
    continue - Resume for, while, or until loops.

SYNOPSIS
    continue [n]

DESCRIPTION
    Resume for, while, or until loops.

    Resumes the next iteration of the enclosing FOR, WHILE or UNTIL loop.
    If N is specified, resumes the Nth enclosing loop.

    Exit Status:
    The exit status is 0 unless N is not greater than or equal to 1.

......

两者的区别 

break语句:

break语句用于退出本层循环,当执行到break会立即跳出当前循环,执行后续代码。
在多层嵌套循环中,break只会跳出最近的一层循环。

continue语句:

continue语句用于结束本次循环,跳过本次循环中剩余的代码,直接进入下一次循环。
在多层嵌套循环中,continue只会跳过最近的一层循环。

函数

hann@HannYang:~$ help -m function
NAME
    function - Define shell function.

SYNOPSIS
    function name { COMMANDS ; } or name () { COMMANDS ; }

DESCRIPTION
    Define shell function.

    Create a shell function named NAME.  When invoked as a simple command,
    NAME runs COMMANDs in the calling shell's context.  When NAME is invoked,
    the arguments are passed to the function as $1...$n, and the function's
    name is in $FUNCNAME.

    Exit Status:
    Returns success unless NAME is readonly.

函数定义 

函数名

Shell函数用关键字 function 声明,跟在后面的 name 即函数名。声明后就用"函数名 [参数]"来调用函数。function 非必须,也能用函数名加一对括号 name() { ... } 来声明定义函数。

函数体

函数名后的 { Commands; } 即函数体,是实现函数功能的主体。

返回值

Shell函数可以有一个返回值,可以使用return语句返回一个值。返回值的范围是0到255之间,0表示成功,非零值表示错误。如果函数中没有return语句,或者使用exit命令退出函数,则函数的返回值为退出命令的返回值。

参数

Shell函数可以通过参数接收输入的值。在函数定义时,可以在括号中指定参数列表。参数可以在函数体中使用,也可以通过特殊变量$#获取函数的参数个数,通过特殊变量$@获取所有的参数。

函数的局部性

Shell函数的变量是局部的,即在函数内部定义的变量只在该函数内部可见,不会影响到函数外部的变量。如果要使用全局变量,需要在函数外部定义。

简单函数示例

hann@HannYang:~$ function add {
>     num1=$1
>     num2=$2
>     sum=$((num1 + num2))
>     echo "The sum of $num1 and $num2 is $sum."
> }
hann@HannYang:~$ add 10 20
The sum of 10 and 20 is 30.

 语句比较少的函数可以在一行内完成,函数体中的语句间用分号“;”来分隔即可。

hann@HannYang:~$ function sub { num1=$1; num2=$2; sum=$((num1 - num2)); echo "The difference between $num1 and $num2 is $sum."; }
hann@HannYang:~$ sub 30 20
The difference between 30 and 20 is 10.

函数的递归

Shell函数可以递归调用自身,这在处理嵌套数据结构或递归算法时非常有用。需要注意的是,递归调用可能会导致栈溢出或效率低下的问题,因此在使用时需要谨慎。

示例:阶乘函数

hann@HannYang:~$ factorial() {
>     if [ $1 -le 1 ]
>     then
>         echo 1
>     else
>         echo $(( $1 * $(factorial $(( $1 - 1 ))) ))
i
}>     fi
> }
hann@HannYang:~$ read -p "请输入一个整数:" num
请输入一个整数:6
hann@HannYang:~$ result=$(factorial $num)
hann@HannYang:~$ echo "$num 的阶乘为 $result"
6 的阶乘为 720

实例操作

数组遍历操作

hann@HannYang:~$ for i in 1 2 3 4 5; do echo -n $i; done; echo
12345
hann@HannYang:~$ for i in {1..5}; do echo -n $i; done; echo
12345
hann@HannYang:~$ sum=0;for i in {1..100};do let sum+=i;done;echo $sum
5050
hann@HannYang:~$ for i in {1..5}{8..10}; do echo -n $i; done; echo
18191102829210383931048494105859510
hann@HannYang:~$ for i in {1..5}{8..10}; do echo -n $i" "; done; echo
18 19 110 28 29 210 38 39 310 48 49 410 58 59 510
hann@HannYang:~$ for i in {A..C}{a..d}; do echo -n $i" "; done; echo
Aa Ab Ac Ad Ba Bb Bc Bd Ca Cb Cc Cd

九九乘法表

hann@HannYang:~$ cat 99mul.sh

#!/bin/bash

for i in {1..9}
do
   for j in {1..9}
   do
     if [ $j -le $i ]
     then
        echo -n "$j*$i=$(($i*$j)) "
     fi
   done
   echo ""
done

hann@HannYang:~$ bash 99mul.sh

1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81

hann@HannYang:~$ cat 99mul.sh

#!/bin/bash

for i in {1..9}
do
   for j in {1..9}
   do
     if [ $j -le $i ]
     then
        printf "%d*%d=%2d " $j $i $(($i*$j))
     fi
   done
   echo ""
done

hann@HannYang:~$ bash 99mul.sh

1*1= 1
1*2= 2 2*2= 4
1*3= 3 2*3= 6 3*3= 9
1*4= 4 2*4= 8 3*4=12 4*4=16
1*5= 5 2*5=10 3*5=15 4*5=20 5*5=25
1*6= 6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7= 7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8= 8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9= 9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81

hann@HannYang:~$ cat 99mul.sh 

#!/bin/bash

for i in {1..9}
do
   for j in {1..9}
   do
     if [ $j -le $i ]
     then
        if [ $j -eq 1 ]
        then
            printf "%d*%d=%d " $j $i $(($i*$j))
        else
            printf "%d*%d=%2d " $j $i $(($i*$j))
        fi
     fi
   done
   echo ""
done

hann@HannYang:~$ bash 99mul.sh

1*1=1
1*2=2 2*2= 4
1*3=3 2*3= 6 3*3= 9
1*4=4 2*4= 8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81


本文简单提一下Linux Shell编程语言的入门要点,之后再对各个环节进行分类详细举例说明。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/886459.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Matplotlib绘图知识小结--Python数据分析学习

一、Pyplot子库绘制2D图表 1、Matplotlib Pyplot Pyplot 是 Matplotlib 的子库,提供了和 MATLAB 类似的绘图 API。 Pyplot 是常用的绘图模块,能很方便让用户绘制 2D 图表。 Pyplot 包含一系列绘图函数的相关函数,每个函数会对当前的图像进行…

线上问题排查: jmap mat 工具排查生产环境占用内存过大问题

一. 背景 线上任务内存占用居高不下, 机器load较高. 排查问题原因. 二. 操作 2.1. 工具文件下载清单. mat 工具 linux版本. ( dump文件太大了有20多G, 只能在服务器上解析. 所以下载linux版本. ) 下载地址: https://eclipse.dev/mat/downloads.php 下载高版本的jdk , 目前…

Spark第二课RDD的详解

1.前言 RDD JAVA中的IO 1.小知识点穿插 1. 装饰者设计模式 装饰者设计模式:本身功能不变,扩展功能. 举例: 数据流的读取 一层一层的包装,进而将功能进行进一步的扩展 2.sleep和wait的区别 本质区别是字体不一样,sleep斜体,wait正常 斜体是静态方法…

数学 容斥原理

全都是mn-1&#xff0c;下图都写成m-n-1了&#xff0c;没有脑子o(╥﹏╥)o 题目链接&#xff1a;214. Devu和鲜花 - AcWing题库 #include <bits/stdc.h> #define ll long long using namespace std; const int mod 1e97; ll A[25]; ll Pow(ll a, ll k){ll ans 1;while…

538页21万字数字政府智慧政务大数据云平台项目建设方案WORD

导读&#xff1a;原文《538页21万字数字政府智慧政务大数据云平台项目建设方案WORD》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 根据业务的不同属性&#xff0c…

爱校对:公文材料的新时代伙伴

在这个数字化、智能化日益增强的新时代&#xff0c;公文材料处理方式也在发生着巨大的变化。传统的人工校对方式逐渐被智能化的工具所替代&#xff0c;而在这其中&#xff0c;爱校对正以其卓越的性能和便捷的使用体验&#xff0c;崭露头角&#xff0c;成为公文材料处理的新时代…

利用高级定时器产生PWM

这个图中阐述了利用高级定时器产生PWM的原理&#xff0c;其中 ARR是自动重装载寄存器(TIMx_ARR)的值 CNT是定时器计数器当前的值 CCRx是捕获/比较寄存器 x(TIMx_CCRx)的值 每经过一次定时器时钟周期就会1&#xff0c;通过设置定时器的输出模式&#xff0c;可以实现&#xff0c…

编译工具:CMake(四)|安装目标文件、普通文件、脚本、目录

编译工具&#xff1a;CMake&#xff08;四&#xff09;|安装目标文件、普通文件、脚本、目录 如何安装目标文件的安装普通文件的安装&#xff1a;非目标文件的可执行程序安装(比如脚本之类)目录的安装 如何安装 安装的需要有两种&#xff0c;一种是从代码编译后直接 make inst…

【C++11保姆级教程】新的函数声明(trailing return type)、右值引用(rvalue references)

文章目录 前言一、新的函数声明&#xff08;trailing return type&#xff09;1.1新的函数声明&#xff08;trailing return type&#xff09;概念1.2新的函数声明的使用 二、右值引用&#xff08;rvalue references&#xff09;2.1右值引用&#xff08;rvalue references&…

[机器学习]特征工程:特征降维

特征降维 1、简介 特征降维是指通过减少特征空间中的维度&#xff0c;将高维数据映射到一个低维子空间的过程。 在机器学习和数据分析中&#xff0c;特征降维可以帮助减少数据的复杂性、降低计算成本、提高模型性能和可解释性&#xff0c;以及解决维度灾难等问题。特征降维通…

机器学习知识点总结:什么是EM(最大期望值算法)

什么是EM(最大期望值算法) 在现实生活中&#xff0c;苹果百分百是苹果&#xff0c;梨百分白是梨。 生活中还有很多事物是概率分布&#xff0c;比如有多少人结了婚&#xff0c;又有多少人有工作&#xff0c; 如果我们想要调查人群中吸大麻者的比例呢&#xff1f;敏感问题很难得…

实战项目:基于主从Reactor模型实现高并发服务器

项目完整代码仿mudou库one thread one loop式并发服务器实现: 仿muduo库One Thread One Loop式主从Reactor模型实现⾼并发服务器&#xff1a;通过模拟实现的⾼并发服务器组件&#xff0c;可以简洁快速的完成⼀个⾼性能的服务器搭建。并且&#xff0c;通过组件内提供的不同应⽤层…

更新arm的linux编译工具链

虑到目前arm的gcc 5.5的工具链对C17语法支持不足&#xff0c;需要升级下工具链。 以下是详细步骤。使用官方提供的工具链 ARM官方的工具链网站&#xff1a; https://developer.arm.com/downloads/-/arm-gnu-toolchain-downloads bare-metal这个版本就是没有操作系统(裸机环…

如何利用Simulation模拟零件受到的冲击力

线性静力载荷作用过程是恒定的&#xff0c;不随时间变化&#xff1b;单冲击力载荷作用的时间很短&#xff0c;高速高能量&#xff1b;今天给大家分享的是Simulation怎么模拟零件受到冲击力。 DEMO案例介绍&#xff1a;板材规格250X120X10&#xff0c;在板材的中心Φ5的区域受冲…

时序预测 | MATLAB实现基于CNN-LSTM卷积长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价)

时序预测 | MATLAB实现基于CNN-LSTM卷积长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价) 目录 时序预测 | MATLAB实现基于CNN-LSTM卷积长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价)预测结果基本介绍程序设计参考资料 预测结果 基本介绍 MATLAB实现基…

【T3】畅捷通T3凭证预览/打印摘要和凭证中看到的摘要不一样。

【问题描述】 畅捷通T3软件中&#xff0c; 凭证打印预览以及打印出来的效果和直接在凭证界面看到的该凭证摘要不一致。 【解决方法】 执行下述清除凭证摘要特殊字符和空格的语句后&#xff0c;重新预览打印。 update GL_accvouch set cdigestREPLACE(cdigest,CHAR(9),) whe…

找pr剪辑素材就上这6个网站,免费可商用。

视频剪辑没素材&#xff0c;就上这几个网站找&#xff0c;免费、付费、商用素材全都有&#xff0c;最重要的是高清、4K无水印&#xff0c;赶紧马住了。 潮点视频 https://shipin520.com/?from_code2510 潮点视频是一个提供优质高清、无水印的视频素材网站&#xff0c;站内有大…

javaScript:数组方法(增删/提取类/截取/操作方法等)

目录 一.数组的增删方法 1.push()数组末尾添加元素 解释 代码 运行截图 2.unshift()向数组的头部添加数组 解释 代码 运行截图 3.pop()数组的尾部删除一个元素 解释 代码 运行截图 4.shift()数组的头部删除一个元素 解释 代码 运行截图 5. splice()任意位…

2003-2022年高铁站开通时间

2003-2022年高铁站开通时间 1、时间区间&#xff1a;2003-2022年 2、指标如下&#xff1a;高铁站名称、开通时间、所在省份、所在城市、所属线路名称、以及相关备注 指标说明&#xff1a;Hsrwsnm[高铁站名称]-高铁站名称 Optm[开通时间]-高铁站开通的时间 Prvn[所在省份]-高…

《Go 语言第一课》课程学习笔记(一)

配好环境&#xff1a;选择一种最适合你的 Go 安装方法 选择 Go 版本 一般情况下&#xff0c;建议采用最新版本。因为 Go 团队发布的 Go 语言稳定版本的平均质量一直是很高的&#xff0c;少有影响使用的重大 bug。可以根据不同实际项目需要或开源社区的情况使用不同的版本。 有…