Linux shell编程基础语法语句(shell变量,shell脚本语句,test测试语句)

简介: Linux shell编程基础语法语句(shell变量,shell脚本语句,test测试语句)

目录


shell是什么

shell编程

shell变量

自定义变量

位置变量

环境变量

特殊变量

shell脚本语句

说明性的语句(注释)

功能性语句

read

重定向问题

expr

test测试语句

文件测试

整数测试


正文


shell是什么


shell是一个命令解析器

我们可以把很多要执行的命令,以某种语言的方式组织起来,交给shell去执行。

这种命令的组织方式,称之为脚本语言。


一个包含多个命令的shell脚本文件。

shell脚本文件是一个普通的文本文件,是以shell脚本语言的方式把多条命令组织在一起的。这些脚本语言可执行文件 交给shell命令解析器,去执行。


shell编程


shell变量


在shell脚本中,我们可以定义变量。

shell脚本变量没有类型的概念,全部都是字符串类型。

shell变量也不需要定义,直接用赋值就行。引用变量名时,使用“$”符号


自定义变量


正如上面所说,不需要对变量定义类型,直接赋值即可,例如

var=100
echo $var        #输出  100
var1=`date`      #``反撇号,引用里面的那个命令或程序或脚本的输出结果(标准输出 类似于printf )
echo $var1       #这两句相当于在终端直接输入date,即引用命令date的输出结果


位置变量


指的是传递给脚本文件或者函数的参数

           在shell脚本或shell函数中:

               $0: --》表示的是第0个参数  命令行的程序运行名 -》1.sh

               $1 $2 ...$9 :表示第一个到第九个参数的名字

               $# :表示命令行参数的个数(不包括脚本名)

               $@: 包含所有的命令行参数

                   $@ ==> $1 $2 ...$9

               $*:包含所有的命令行参数

                   $@ ==> $1 $2 ...$9

               $?:表示前面一个命令或者一个程序的退出码(返回值 进程的返回值)

                   main返回值 或者exit返回值

例如shell脚本中这么写

echo "$0 $1 $3 $4"

在终端我们这么输入

./shell.sh 12 ab ff %$& ** lk

最终输出的结果是    ./shell 12 ff ** lk,会对应输出


环境变量


   环境变量:在同一个终端下面所有进程都可以共享的变量。

 

   HOME: 用户主目录的路径

       eq:

           echo $HOME  会显示当前用户的家目录路劲名

          如 -->/home/china

   PATH:

       命令或者可执行程序的搜索路径

       你们有没有发现一个问题?

           我们在运行一个命令的时候,比如:ls

           我并没没有指定这个命令(文件)的路径,那么系统怎么知道这个命令或程序文件在哪呢?

         

           eq: echo $PATH

       环境变量PATH:

           PATH :

               指定系统要搜索的命令或可执行文件的路径列表

                   path的值:

                       dir1:dir2:..

                   eq:  /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/arm/5.4.0/usr/bin:/snap/bin

     

       如果你想把你的一个程序或者命令,在运行的时候不需要指定路径,那么

       你的程序或者文件的路径,必须要在PATH列出的那些1目录下。

           eq:

               1. cp 2.sh /usr/local/bin [把文件放到可执行文件的目录下去]

             

               2.能不能改变环境变量PATH的值呢?

                   可以的

                   怎么改变呢?

                 

                   export 环境变量名=环境变量的值

                 

                   eq:

                       export PATH=$PATH:/home/china/shell


特殊变量


shell数组

       数组名[下标]=value 下标:0,1,2...n-1

     

   引用数组元素:

       1.${数组名[下标]}

       2.${数组名} $数组名 ==》在bash/dash中引用的是数组的第一个元素。

     

    unset:清除数组元素  

   引用数组: 引用整个数组(引用数组中的所有元素)

       1.${数组名[*]}

       2.${数组名[@]}


例如

name=(i am very happy)
name[0]=myself
echo ${name[@]}    #myself am very happy
unset name[0]
echo ${name[@]}    #am very happy
unset name[@]
echo ${name[*]}    #无输出
name[0]=your
name[1]=are
echo ${name[*]}    #your are


shell脚本语句


说明性的语句(注释)


以#开头的行 就是注释行


功能性语句


       任意操作系统的命令(eq: ls, echo, cd , date...)

       shell内部命令,自编的的可执行程序。


我们可以来试一下,用.sh文件去调用.c文件


例如当前目录为 /mnt/test 次目录下有文件  1.c  ,1.sh,我们在1.sh中写入:

cd /mnt/test    #如果cd目录名,就默认是当前文件
./1             #该.c文件已经执行过 gcc 1.c -o 1


read


ead:表示从终端获取输入,如


read var1 var2
echo "var1 = $var1"
echo "var2 = $var2"

我们在终端输入两个字符串,回车,就能看到输出啦。但是需要注意的是,写在一行的read获取输入时,是以空格隔开的,如果输入 1 2 3 4 5,超出了两个怎么办,本例题会输出var1 = 1,var2 = 2 3 4 5,也就是最后一位会将这一行剩下的所有字符都获取。


read var1 
read var2
echo "var1 = $var1"
echo "var2 = $var2"

想这个,就是以回车符隔开,var1会将第一行所有字符获取,var2同理


重定向问题


输入重定向


命令的输入请求是向标准输入设备(如:键盘)提交请求。

我们也可以很方便地把输入来源指定为另外一个设备或文件。

这种改变输入来源,我们叫做“输入重定向”

             

在命令后面加一个<filename

该命令或者语句块所有输入来源来自filename指定的文件


read var1 var2 <test.txt

echo "var1 = $var1"

echo "var2 = $var2"

test.txt 内容自定义,会将同目录下test.txt文件中的内容读取出来,var1 与var2按顺序获取信息,以空格分割。


输出重定向


命令的输出请求通常是向标准输出设备(如:终端)提交请求。

我们也可以很方便地把输出目的指定为另外一个设备或文件。

这种改变输出目的,我们叫做“输出重定向”

         

在命令后或者语句 >filename

在命令后或者语句 >>filename

>会先清空filename原来的内容(如果有),然后再输出到文件

>> 追加,把输出的内容添加到filename指定的文件末尾去。

china@ubuntu:~/text$ cat test.txt
sma] 
hiazhnenrghk
china@ubuntu:~/text$ echo "heihei">test.txt
china@ubuntu:~/text$ cat test.txt
heihei
china@ubuntu:~/text$ echo "aduiduidui">>test.txt
china@ubuntu:~/text$ cat test.txt
heihei
aduiduidui


expr


expr主要是用于进行简单的算数运算,包括:

               +         加

               -         减

               \*        乘(注意,需要加反斜杠)

               /         除

               %       取余


#从键盘中输入两个数,并对他们求积输出
read i j
ret=`expr $i + $j`    
echo "$i \* $j = $ret"

使用 expr时,要用``反撇号撇起来


test测试语句


echo $?    #永远代表最近的一个表达式的值或返回值


文件测试


命令行 含义
-d filename 测试filename是否为一个目录(directory)
-f filename 测试filename是否为一个普通文件(file)
-L filename 测试filename是否为一个链接文件(link)
-r filename   测试filename是否存在并可读
-w filename   测试filename是否存在并可写
-x filename   测试filename是否存在并可执行
-s filename 测试filename是否存在且长度不为0

eq:测试1.sh是否存在并可读


test -r 1.sh
echo $?

f1 -nt f2:

      nt: newer than

      测试文件1是否比文件2更新

          eq:


test 1.sh -nt 2.sh
echo $?


f1 -ot f2:

      ot: older sister

      测试文件1是否比文件2更旧

          eq:


test 1.sh -nt 2.sh
echo $?

最后,test命令可以用[]来简写。

NOTE: expression前后左右要空格

test expression(表达式) <==> [ expression ]

           eq:


test 1.sh -nt 2.sh 

以上表达式也可以写成


[ 1.sh -nt 2.sh ] 
echo $?

test复合表达式


组合了两个或两个以上的测试表达式,称为复合表达式,为了使用复合表达式

你可以使用test([])内置的操作符,也可以用条件操作符。

               (1) 使用test内置的操作符 来创建复合表达式  --》1个test语句

                   语法:


test expr1 "test_buildin" expr2

也可以写成


[ expr1 "test_buildin" expr2 ]

"test_buildin":test 内置的操作符:

                               -a and 并且

                               -o or   或者

                   eq:

                       测试一个文件($1)是否为普通文件,并且这个文件比文件2($2)更新


test -f $1 -a $1 -nt $2
[ -f $1 -a $1 -nt $2 ]    #这两句是一样的

eq:

                       a b c

                       a>b或b>c


[$a -gt $b -o $b -gt $c]

                       5 > 4 > 3


[ 5 -gt 4 -a 4 -gt 3 ]


                     

(2)使用条件操作符来创建复合表达式


语法:

        test expr1 "op" test expr2


op 含义
&&
||
!

eq:

     测试一个文件1$1是否为普通文件,并且这个文件比文件2($2)更新。


test -f $1 && test $1 -nt $2
[ -f $1 ] && [ $1 -nt $2 ]     #这两句一样

a>b且b>c -->条件操作符


整数测试


   test $a -eq $b

               eq: equal 测试两个整数是否相等


123.png

         

           test $a -ne $b

               ne: not equal 不等于


test 3 -ne 4
echo $?    # 0 测试成功
test 3 -ne 3
echo $?    # 1 测试失败


           test $a -gt $be

               gt:greater than 大于

   


test 3 -gt 4
echo $?     #1-->测试失败
test 4 -gt 3
echo $?    #0 测试成功


                 

           test $a -lt $b

               lt: less than  小于


test 3 -lt 4
echo $?    # 0 测试成功
test 4 -lt 3
echo $?    # 1 测试失败

     

           test $a -le $b

               le : less or equal 小于等于


test 3 -le 4
echo $?    # 0 测试成功


                 

           test $a -ge $b

               ge:greater or equal 大于等于


test 3 -ge 4
echo $?    # 1 测试失败

   test $a op $b

op 含义
-eq ==
-ne !=
-gt >
-lt <
-ge >=
-le <=
相关文章
|
23天前
|
Ubuntu Linux Shell
Linux 系统中的代码类型或脚本类型内容
在 Linux 系统中,代码类型多样,包括 Shell 脚本、配置文件、网络配置、命令行工具和 Cron 定时任务。这些代码类型广泛应用于系统管理、自动化操作、网络配置和定期任务,掌握它们能显著提高系统管理和开发的效率。
|
1月前
|
Web App开发 网络协议 Linux
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
这篇文章是关于Linux命令的总结,涵盖了从基础操作到网络配置等多个方面的命令及其使用方法。
67 1
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
|
27天前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
1月前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
42 1
|
1月前
|
存储 Shell Linux
【Linux】shell基础,shell脚本
Shell脚本是Linux系统管理和自动化任务的重要工具,掌握其基础及进阶用法能显著提升工作效率。从简单的命令序列到复杂的逻辑控制和功能封装,Shell脚本展现了强大的灵活性和实用性。不断实践和探索,将使您更加熟练地运用Shell脚本解决各种实际问题
30 0
|
15天前
|
JSON Java 测试技术
SpringCloud2023实战之接口服务测试工具SpringBootTest
SpringBootTest同时集成了JUnit Jupiter、AssertJ、Hamcrest测试辅助库,使得更容易编写但愿测试代码。
49 3
|
1月前
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
67 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
|
2月前
|
移动开发 JSON Java
Jmeter实现WebSocket协议的接口测试方法
WebSocket协议是HTML5的一种新协议,实现了浏览器与服务器之间的全双工通信。通过简单的握手动作,双方可直接传输数据。其优势包括极小的头部开销和服务器推送功能。使用JMeter进行WebSocket接口和性能测试时,需安装特定插件并配置相关参数,如服务器地址、端口号等,还可通过CSV文件实现参数化,以满足不同测试需求。
250 7
Jmeter实现WebSocket协议的接口测试方法
|
2月前
|
JSON 移动开发 监控
快速上手|HTTP 接口功能自动化测试
HTTP接口功能测试对于确保Web应用和H5应用的数据正确性至关重要。这类测试主要针对后台HTTP接口,通过构造不同参数输入值并获取JSON格式的输出结果来进行验证。HTTP协议基于TCP连接,包括请求与响应模式。请求由请求行、消息报头和请求正文组成,响应则包含状态行、消息报头及响应正文。常用的请求方法有GET、POST等,而响应状态码如2xx代表成功。测试过程使用Python语言和pycurl模块调用接口,并通过断言机制比对实际与预期结果,确保功能正确性。
260 3
快速上手|HTTP 接口功能自动化测试
|
2月前
|
JavaScript 前端开发 测试技术
ChatGPT与接口测试
ChatGPT与接口测试,测试通过
49 5
下一篇
无影云桌面