目录

一、概念

二、简单创建脚本

三、shell语法

1.变量

2.环境变量

3.参数变量

4.条件

5.控制结构

if语句

elif语句

for语句

while循环

Until循环

case

四、脚本调用脚本

四、C程序调用脚本——exec替换

五、函数在shell内的使用


一、概念

什么是shell?

shell是一个作为用户与Linux系统间接口的程序,它允许用户向操作系统输入需要执行的命令。

下图显示了shell(实际上是两种shell:bash、csh)和其他程序环绕在Linux内核的四周。

在大多数Linux发行版中,默认的shell程序/bin/sh实际上是对程序/bin/bash的一个连接。可以使用如下命令来查看bash的版本号

$ /bin/bash --version

如果想要切换到另一个shell(例如,bash不是你的系统中默认的shell ),你只需直接执行需要的shell程序(例如,/bin/bash)就可以运行新的shell并且改变命令提示符了。

二、简单创建脚本

1.创建脚本的后缀名为.sh

2.执行"./my.sh"系统发现是脚本文件后会帮助我们启动bash,达到和"bash my.sh"一样的结果

3.书写shell的规则与含义

如下是一个简单的shell编程,第一行是执行绝对路径下的bash,如果没有写系统会认为是默认的系统解释器,第3行是输出“hello shell”的内容,第5行exit命令的作用是保证脚本程序能够返回一个有意义的退出码。

  • 程序中的注释是以#符号开始,一直持续到该行的结束。但是第一行#!是特殊形式的注释,是告诉系统同一行上紧跟在他后面的那个参数是用来执行文本文件的程序。

下例是键盘输入并输出值显示。第3行是提示符输入,第4行是从键盘读取数据给line,第6行是printf输出line值。($的含义在下面第三板块变量内讲解)

如果想要换行的话,应加入\n,如下所示:

三、shell语法

在本小结内包含了一下重要内容:

  • 变量:字符串、数字、环境和参数
  • 条件:shell中的布尔值
  • 程序控制:if、elif、for、while、until、case
  • 命令控制
  • 函数
  • shell内置命令
  • 获取命令的执行结果
  • here文档

1.变量

一些规则:

  • 并不需要事先声明变量,只用在要使用是创建即可
  • 默认情况下,所有变量都被看作字符串并以字符串来存储,例如下图中第3行的""并不一定是字符串的存储。
  • 双引号“”在脚本中是弱引用。如上图第四行中"hello $a"输出是hello 100,第5行的s="hello 100"
  • 单引号‘’是原样输出,例如‘hello $a’输出就是hello $a
  • 大小写仍是被区分的
  • 要访问变量的内容需要在前面加$符号,例如$a,就是取a的值
  • 变量赋值是对空间的指向。例如,a=100不是说在a的空间内存放100,而是让a指向100所在的空间
  • 如果字符串内包含空格,就必须用引用把他们括起来。
  • 等号两边不能有空格,如有有空格就代表判等的含义了
  • ++写法:
    • 两种做法:

      1.使用命令let

      2.使用命令expr

      2*3

      错误的

      这样正确,需要加入\,进行特殊字符识别

  • $?是上一句语句执行的结果

    20行输出了19行的内容,21行输出20行,成功用0表示。

2.环境变量

当一个shell脚本程序开始执行时,一些变量会根据环境设置中的值来进行初始化。这些变量通常用大写字母做名字,以便把他们和用户脚本程序里定义的变量区分开来,后者按惯例都用小写字母做名字。

下图是系统使用手册中列举的环境变量。

下图举例,输出参数变量hello 123,其中命令$1 ->第一个变量;$2 ->第2个变量,而对于第三个变量没有,所有$3输出为空。

如下示例对一级提示符修改为“^_^”:

恢复输入下面命令:

3.参数变量

参数变量表如下所示:

除了使用echo命令来查看变量内容外,还可以使用read命令来读取

4.条件

test或[命令

shell内bool布尔判断命令使用[或test。[在使用时还需要符号]结尾。

test命令可以使用条件类型归为3类:字符串比较、算术比较和文件有关的条件测试,如下图所示:

5.控制结构

if语句

这个要结合上面条件讲的内容一起使用,使用规则如下:

if condition
thenstatements
elsestatements
fi

  elif语句

和else if相同用法,但是在shell内与if遵守相同规则

下面是一些具体的示例

判断文件的类型:

此处,也体现了脚本文件的好处,如果用C语言去写势必更加复杂化。

对成绩进行判断等级示例:

echo "input"
read gradeif [ "$grade" -gt 100 || "$grade" -lt 0]
then echo "error!\n"if [ "$grade" -ge 80]
then echo "A"
elif [ "$grade" -ge 70]
then echo "B"
elif[ "$grade" -ge 60]
then echo "C"
elseecho "D"
fi

for语句

我们可以使用for结构来循环处理一组值,这组值可以是任意的字符串集合。下面是它的语法:

for variable in values
dostatements
done

示例:

补充在脚本中对命令的使用,例如想要通过"ls"去输出当前路径下的文件内容然后赋值给str,但是直接str=ls这样的话,str的值是ls,并不是ls代表路径下的一系列文件。

此时,需要用“$()”或者“``”反引号去识别命令,如下就能得到我们想要的结果

也可以用for语句输出

while循环

while condition
do statements
done

示例,对对小于10的值打印:

对i++

结果:

死循环

i<10,对i++,用while循环遍历i,如果i=5时跳过,其余i的值进行输出:

i<10,对i++,用while循环遍历i,如果i=5时退出,其余i的值进行输出:

对密码123进行验证,要求输入在3次以内:

Until循环

条件满足时停下,未满足时持续执行

until condition
do statements
done

示例

用until判断本地是否有“file.txt”文件

case

case variable inpattern [ | pattern ] ...)statements;;pattern [ | pattern ] ...)statements;;...
esac

;;  结束

| 可要可不要的条件,对多个条件时的写法

示例:

输入是yes时输出yes,输入是no时输出no,其余的输出***

结果:

输入是yes或者y时(多个条件)输出yes

结果:

如果要任意大小写都能识别,用yes | y | Yes | YES...这样写就很复杂,为了让case的匹配功能更强大,可以使用如下的模式:

测试实例:

四、脚本调用脚本

a.sh调用b.sh

需要用chmod a.sh去打开权限。

执行结果:

结果说明了一个问题:运行a.sh和b.sh的脚本的解释器,不是同一个解释器。如下代码进行说明:

那么能否让a.sh和b.sh在同一个解释器内?

可以的,用下面第5行/第6行的方式执行即可:

source/.+空格+b.sh路径:

此时,id相同,同一个解释器:

当前脚本中定义的变量想让其他脚本也能使用,即想要实现两脚本之间传参,需要通过下面3种方法实现:

  1. 当参数传进去,然后以”$‘来访问参数​​​​​​​​​​​​​​​​​
  2. 将要执行的新脚本,以 '  . ' 或者  ‘source ’ 命令的方式执行​​​​​​​
  3. 将变量设置为环境变量

四、C程序调用脚本——exec替换

脚本文件:

C程序:
        子进程打印pid,并用execl替换调用脚本文件(系统自动判断是否是脚本,会自动调用命令解释器)

运行结果:

五、函数在shell内的使用

 函数调用

先执行脚本文件再调用函数:

如果在阅读代码时,存在main()和main脚本时,也没有太大意义,其实也就是调用main()函数。

再举例脚本参数和调用函数参数的举例:

 unset撤销变量

在解释器内的变量可以理解为不区分局部还是全局,因此可以被任意访问,所以需要unset这个功能撤销变量。如下代码示例对mystr赋值为hello,然后任意输出都能得到hello,输入“unset mystr”时就不能再输出了。

local”在本函数内使用完参数之后,自动的unset,在函数外就无法再使用,避免忘记写unset

总结
1.怎么传参 ->直接写在函数后面

2.在函数内如何获得该参数 ->通过$1,$2....

3.怎么撤出变量 ->unset,local

五、

内容暂时先到这里,剩下的下周补齐~

什么是shell?怎么编写脚本?怎么调用脚本?相关推荐

  1. linux shell运行脚本,Linux shell脚本中调用另一个shell(exec、source、fork)

    在运行shell脚本时候,有三种方式来调用外部的脚本,exec(exec script.sh).source(source script.sh).fork(./script.sh) 1.exec(ex ...

  2. Linux系统shell脚本、python脚本编写

    GPU排队脚本 python脚本 GPU排队脚本 ---- GPU一旦空闲触发脚本执行程序 参考: GPU排队脚本(python脚本) cmd = 'bash run.sh' 该句设置要执行的pyth ...

  3. python调用脚本或shell的方式

    python调用脚本或shell有下面三种方式: os.system() 特点: (1)可以调用脚本. (2)可以判断是否正确执行. (3)满足不了标准输出 && 错误 command ...

  4. linux shell脚本中调用另一个shell脚本

    先来说一下主要以下有几种方式: 1.fork: 如果脚本有执行权限的话,path/to/foo.sh.如果没有,sh path/to/foo.sh. 2.exec: exec path/to/foo. ...

  5. shell实例第19讲:一个脚本中调用另一个脚本的3种方法

    在Shell脚本中调用另一个脚本(3种方法) 准备:主脚本是second.sh,主脚本中调用first.sh 方法1:exec(1)执行方式:exec /home/weibo/shell_test/s ...

  6. java channelexec_java-使用SSH exec通道调用Shell脚本,但忽略对其他Shell脚本的调用

    我正在使用此处提供的有用示例,使用JSch exec在远程服务器上执行Shell脚本.我可以看到脚本返回的回显,并且结尾处的退出状态为0-乍一看,一切看起来都很不错. 但是,问题在于脚本本身会调出其他 ...

  7. 【linux】Shell脚本中调用另外一个脚本的方法

    在Linux平台上开发,经常会在console(控制台)上执行另外一个脚本文件,经常用的方法有:./my.sh 或 source my.sh 或 . my.sh:这三种方法有什么不同呢?我们先来了解一 ...

  8. python调用shell用什么类_python脚本中调用shell命令

    在python脚本中调用类uninx上的系统命令或工具.有下面两种方法 os.system(string cmd | scriptname.sh) 参数可以是shell命令,也可以是shell脚本. ...

  9. shell脚本和python脚本和go脚本的区别_Nodejs中调用系统命令、Shell脚本和Python脚本的方法和实例-Go语言中文社区...

    NodeJS 子进程提供了与系统交互的重要接口,其主要 API 有: 1)标准输入.标准输出及标准错误输出的接口: child.stdin 获取标准输入 child.stdout 获取标准输出 chi ...

最新文章

  1. DeepMind提出强化学习新方法,可实现人机合作
  2. 同学遇见过的面试问题
  3. pwnable.tw unexploitable 分析
  4. 软测管理工具实践-01
  5. 数组和lookup函数
  6. html桌面图标样式,如何更改图标样式,换桌面图标的方法
  7. .NET Core全新路线图
  8. strstrsubstr、AfxGetApp
  9. 那些年我们用过神级的代码注释
  10. android P版本ro.build.date时间修改
  11. 在保护继承中基类的共有成员_C++学习刷题13--继承的实现、继承的方式
  12. 基于JAVA+SpringBoot+Mybatis+MYSQL的校园招聘管理系统
  13. 电商峰值系统架构设计
  14. Android 9.0 蓝牙配对流程
  15. redis数据类型底层实现
  16. 磐石云服务器_超牛的盘石云服务器平台
  17. 健身产品如何线上引流,健身行业如何线上引流?
  18. redis的incr和incrby命令
  19. Android录音-音频基础知识
  20. 去你X的上网行为监控系统

热门文章

  1. 面经/字节跳动,面试流程及问题分享(附答案)
  2. UI设计干货可临摹素材|打造精美的UI界面!
  3. POJ - 1860 货币兑换(bellman)
  4. VSphere Client无法连接到x.x.x.x,出现未知连接错误
  5. ABAP 基本类型 强制转换
  6. Blender UV 打直
  7. 电力杆附挂轻型自承式光缆的设计要点
  8. java 开发扑克游戏_Java 04实战开发 扑克游戏
  9. IDK(自己瞎想的一种共识算法)
  10. const 与 指针的恩怨情仇!!!