什么是Shell

Shell是一个命令解释器,它会解释并执行命令行提示符下输入的命令。除此之外,Shell还有另一个功能,如果要执行多条命令,它可以将这组命令存放在一个文件中,然后可以像执行Linux系统提供的其他程序一样执行这个文件,这个命令文件就叫做Shell程序或者Shell脚本。当运行这个文件时,它会像在命令行输入这些命令一样顺序地执行它们。

Shell脚本支持变量、命令行参数、交互式输入、函数模块、各种控制语句等高级编程语言的特性,如if、case、while和for等。利用Shell程序设计语言可以编写出功能非常复杂的脚本程序,把大量的任务自动化,尤其是那些需要输入大量命令而在执行过程中不太需要与用户进行干预的系统管理任务。

为了让Shell能读取并且执行Shell程序,Shell脚本的文件权限必须被设置为可读和可执行。为了让Shell可以找到程序,可以选择输入完全路径名,或者将这个脚本的路径放在PATH环境变量指定的路径列表中。Shell脚本不是复杂的程序,它是由上往下逐行解释执行的。脚本的第一行总是以“#!<Shell解释器文件路径>”开始,用来指定该脚本是使用那种Shell进行解释执行。

编写Shell脚本

1)使用VI或者其他任意的文本编辑工具创建一个名为HelloWorld.sh的文件,并在其中加入以下内容:

[root@localhost ~]# vi HelloWorld.sh
#!/bin/bash
#The first Shell script
echo "Hello World!"

2)为HelloWorld.sh文件添加执行权限;

[root@localhost ~]# chmod +x HelloWorld.sh

3)运行HelloWorld.sh脚本,查看运行结果;

[root@localhost ~]# ./HelloWorld.sh
Hello World!

条件测试 | 数值测试

编写Shell脚本时,有时要先测试字符串是否一致、数字是否相等或者检查文件状态,基于这些测试的结果再做下一步的操作。Shell脚本的条件测试可以用于测试字符串、文件状态和数字。

测试完成后可以通过“$?”获取测试的结果,其中0为正确,1为错误。

数值测试用于对两个数值进行比较并得出判断结果,包括:等于、不等于、大于、大于等于、小于、小于等于。

数值判断的格式:[ 数值1 关系运算符 数值2 ]

方括号与条件之间必须要有空格。

数值测试的关系运算符  
关系运算符 说明
-eq  两个数值相等
-ne 两个数值不相等
-gt 第一个数大于第二个数
-lt 第一个数小于第二个数
-ge 第一个数大于等于第二个数
-le 第一个数小于等于第二个数

测试两个数值是否相等;

[root@localhost ~]# [  -eq  ]           //测试1024是否等于1024
[root@localhost ~]# echo $?
//两个数值相等
修改第一个数值为1124后再次进行测试。
[root@localhost ~]# [ -eq ]
[root@localhost ~]# echo $?
//两个数值不相等
[root@localhost ~]# number1= //number1为500
[root@localhost ~]# number2= //number2为254
[root@localhost ~]# [ $number1 -gt $number2 ]
[root@localhost ~]# echo $?
//number1大于number2
[root@localhost ~]#

条件测试 | 字符串测试

字符串测试可以对两个字符串的值进行比较,也可以测试单个字符串的值是否为空或者非空。

字符串测试的格式:[ 关系运算符 字符串 ]或者[ 字符串1 关系运算符 字符串2 ]

字符串测试的关系运算符  
关系运算符 说明
= 两个字符串相等
!= 两个字符串不相等
-z 字符串为空
-n

字符串不为空

要测试两个字符串是否相等
[root@localhost ~]# [ "abc" = "abc" ]
[root@localhost ~]# echo $?
//两个字符串相等
把第一个字符串更改为bac后进行测试
[root@localhost ~]# [ "bac" = "abc" ]
[root@localhost ~]# echo $?
//两个字符串不相等
如果把运算符改为“!=”
[root@localhost ~]# [ "bac" != "abc" ]
[root@localhost ~]# echo $? 判断环境变量是否为空或者非空
[root@localhost ~]# [ -z $python1 ]
[root@localhost ~]# echo $? [root@localhost ~]# [ -n $python1 ]
[root@localhost ~]# echo $?
//python1变量为空
[root@localhost ~]# python1="test" //对python1变量进行赋值
[root@localhost ~]# [ -z $python1 ]
[root@localhost ~]# echo $?
//python1变量不为空
[root@localhost ~]#

条件测试 | 文件状态测试

Linux的Shell脚本支持对文件状态的检测,包括检测文件的类型、文件的权限和文件的长度等;

文件状态测试的格式:[ 关系运算符 字符串 ]
文件状态测试的关系运算符
关系运算符 说明
-d 目录
-f 一般文件
-L 链接文件
-r

可读

-w 可写
-x 可执行
-u 设置了suid
-s 文件长度大于0、非空
[root@localhost ]# ll
总用量
-rwxr-xr-x. root root 6月 : HelloWorld.sh
[root@localhost ]# [ -r HelloWorld.sh ]
[root@localhost ]# echo $?
//HelloWorld.sh 文件可读
[root@localhost ]# [ -w HelloWorld.sh ]
[root@localhost ]# echo $?
//HelloWorld.sh 文件可写
[root@localhost ]# [ -x HelloWorld.sh ]
[root@localhost ]# echo $?
//HelloWorld.sh 文件可执行
[root@localhost ]#

条件测试的逻辑操作符

逻辑操作符分以下3种:

  • -a:逻辑与,只有当操作符两边的条件均为真时,结果为真,否则为假。

  • -o:逻辑或,操作符两边的条件只要有一个为真,结果为真,只有当两边所有条件为假时,结果为假。

  • !:逻辑否,条件为假,结果为真。

如果要测试两个文件的状态
[root@localhost ]# ll test1 test2
-rw-rw-r--. root root 6月 : test1
-rw-rw-r--. root root 6月 : test2
[root@localhost ]# [ -r test1 -a -r test2 ] //测试文件 test1 和 test2 是否都可读
[root@localhost ]# echo $? [root@localhost ]# [ -x test1 -o -x test2 ] //测试文件 test1 和 test2 是否至少有一个可执行
[root@localhost ]# echo $? 如果要测试两个数值变量
[root@localhost ]# number1=
[root@localhost ]# number2=
[root@localhost ]# [ $number1 -eq -a $number2 -gt ] //测试是否number1 大于10 且 number2 大于20
[root@localhost ]# echo $? 如果要测试文件test1 是否为不可读
[root@localhost ]# ls -l test1
-rw-rw-r--. root root 6月 : test1
[root@localhost ]# [ ! -r test1 ] //测试文件test1 是否为不可读
[root@localhost ]# echo $? [root@localhost ]#

Shell编程-条件测试 | 基础篇的更多相关文章

  1. (C#)Windows Shell 编程系列1 - 基础,浏览一个文件夹

    原文 (C#)Windows Shell 编程系列1 - 基础,浏览一个文件夹 (本系列文章由柠檬的(lc_mtt)原创,转载请注明出处,谢谢-) Windows Shell 编程,即 Windows ...

  2. Shell高级编程学习笔记(基础篇)

    目录 1.shell脚本的执行方法  2.shell的变量类型  3.shell特殊变量 4.变量子串的常用操作  5.批量修改文件名实践   6.变量替换 7.在shell中计算字符串长度的方法  ...

  3. Shell 编程 条件语句

    本篇主要写一些shell脚本条件语句的使用. 条件测试 test 条件表达式 [ 条件表达式 ] 文件测试 -d:测试是否为目录(Directory). -e:测试文件或目录是否存在(Exist). ...

  4. 大数据系列博客之 --- 深入简出 Shell 脚本语言(基础篇)

    首先声明,此系列shell系列博客分为四篇发布,分别是: 基础篇:https://www.cnblogs.com/lsy131479/p/9914747.html 提升篇:https://www.cn ...

  5. 关于shell脚本——条件测试、if语句、case语句

    目录 一.条件测试 1.1.表达说明 1.2.test命令 文件测试 1.3.整数值比较 1.4.字符串比较 1.5.逻辑测试 二.if语句 2.1.单分支结构 2.2.双分支结构 2.3.多分支结构 ...

  6. 二、shell 脚本条件测试

    目录 一.条件测试 test 格式 文件测试 文件测试常见选项 整数值比较 字符串比较 浮点数的运算 逻辑测试 二.if语句 1单分支 2双分支结构 3多分支结构 三元运算符 三.case 一.条件测 ...

  7. Linux Shell 03 条件测试

    条件测试 方式一:在Bash中 test命令和[]是等价的. test命令: if test $n1 -eq $n2 then echo "The two number are equal& ...

  8. 【shell编程】之基础知识-语法

    一.shell变量 1.定义变量 定义变量时,变量名不加美元符号($,PHP语言中变量需要), 如: your_name="runoob.com" 注意,变量名和等号之间不能有空格 ...

  9. 【shell编程】之基础知识了解shell

    一.什么是shell Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell 是指一种应用程序,这个应用程序提供了 ...

随机推荐

  1. 三、Dockerfile的说明和编写

    一.docker hub的使用和说明: 我们要去找镜像,一般都会 https://hub.docker.com  的网站中去找,目前linux的容器,我们目前首选是alpine,因为容器非常小,可以满 ...

  2. 关于word-break和word-wrap的使用和区别

    当一段文字有一个长长长的英文单词的情况下使用这两个属性的区别: word-wrap: 哈哈哈, aaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb word-break: ...

  3. Git打标签、还原到具体标签版本代码

    1.打标签:(在需要合并的分支上先打一个标签,方便回滚) $ git tag 标签名 -----此标签将打在本地,还需要推送至远程仓库 $ git push origin 标签名 -----此步骤执行 ...

  4. python3 练手实例6 做一个简单日历

    import calendar year = int(input('请输入要查询的年份:')) month = int (input('请输入要查询的月数:')) print (calendar.mo ...

  5. vmware虚拟机磁盘挂载

    执行mount命令时找不到介质或者mount:no medium found的解决办法 使用vmware时,在虚拟机设置里,设置CD/DVD为系统镜像,挂载时,有时会有找不到介质或者no medium ...

  6. windows安装解压版mysql

    记录下用批处理安装mysql5.7.18的过程与踩到的坑 先在安装目录新建文件my.ini [mysql] default-character-set=utf8 basedir=TODO datadi ...

  7. L1-Day6

    1.我喜欢哈尔滨的夏天 [我的翻译]I like the summer in harebing. [标准答案]I like the summer in Harbin. [对比分析]哈尔滨 Harbin ...

  8. 转 原生js canvas实现苹果电脑mac OS窗口最小化效果

    http://www.17sucai.com/pins/demo-show?id=2459 http://www.17sucai.com/pins/demo-show?id=2458  很多资料 ,前 ...

  9. 记录一个使用HttpClient过程中的一个bug

    最近用HttpClient进行链接请求,开了多线程之后发现经常有线程hang住,查看线程dump java.lang.Thread.State: RUNNABLE at java.net.Socket ...

  10. SpringMVC使用CommonsMultipartResolver上传文件

    DispatcherServlet并没有实现任何解析multipart请求数据的功能,它将该任务委托给了Spring中MultipartResolver策略接口的实现,通过该接口的实现类来解析mult ...