Linux shell 脚本学习

news2024/11/28 10:44:39

目录

1.shell编程的基本格式

开头

注释

 加可执行权限

执行脚本的三种方法

2.变量

定义变量和清除变量

从键盘获取值(read)

 读取多个值

 只读变量(readonly)

 位置变量

 变量运算

3.条件测试

文件测试

字符串测试

 数值测试

 逻辑操作符

4. if条件语句

if条件语句语法

单分支if语句

 多分支语句

5. case条件语句

case语句的语法

 case语句实践

6.for循环语句

语法格式

 for循环显示当前目录下的文件

for循环打印99乘法表

 7.while循环和until循环

while循环语法

while循环示例

until循环语法

until循环示例

 8.break,continue和exit

break示例

continue示例

exit示例

9.函数

定义函数的格式

调用函数格式

案例演示

函数中的return

函数案例

统计路径下文件数目

 shell脚本之猜数字游戏


1.shell编程的基本格式

开头

shell脚本通常以 #!/bin/bash 或 #!/bin/sh 开头,如下面这个最简单的shell脚本。

#!/bin/bash
echo "hello world"

通常最开始定义的是该脚本的解释器,即该脚本由什么shell来解释

注释

单个的 # 为注释当前行的内容。

 加可执行权限

可以看到,当给hello.sh文件加上可执行权限后,其颜色也会发生变化。

执行脚本的三种方法

1. ./xxx.sh---------------按照文件中指定的解释器解析,并且这种方式需要文件有可执行权限

2. bash xxx.sh---------指定bash解释器解析

3. . xxx.sh---------------使用默认解释器执行,不会执行shell脚本第一行,但是不能不写

注意

当使用 ./xxx.sh 和 bash xxx.sh 执行文件时,会创建一个子shell。

2.变量

变量分为环境变量(全局变量)和普通变量(局部变量)。

        环境变量:可以在创建的shell以及它的子shell中使用。

        普通变量:只能在当前shell中使用。

若想要将变量设置为全局变量,则需要用 export 将指定的变量导出为全局变量。

export 变量名                     //定义全局变量

export 变量名=变量值       //定义全局变量并修改或赋值变量值

export -n 变量名                //取消定义的全局变量变成局部变量

定义变量和清除变量

定义变量: 变量名=value

引用变量: $变量名

清除变量: unset 变量名

[root@group7 new]# vim hello.sh
#!/bin/bash
number=5
echo $number
#清除变量
unset number
echo $number
[root@group7 new]# sh hello.sh
5

从键盘获取值(read)

#read [选项] [变量名]
#-d :表示定界符,一般情况下是以IFS为参数的间隔,但是通过-d,我们可以定义一直读到出现执行的字符位置。例如read –d madfds value,读到有m的字符的时候就不在继续向后读,例如输入为 hello m,有效值为“hello”,请注意m前面的空格等会被删除。这种方式可以输入多个字符串,例如定义“.”作为结符号等等。
#-e :只用于互相交互的脚本,它将readline用于收集输入行。读到这几句话不太明白什么意思,先跳过。
#-n :用于限定最多可以有多少字符可以作为有效读入。例如echo –n 4 value1 value2,如果我们试图输入12 34,则只有前面有效的12 3,作为输入,实际上在你输入第4个字符‘3’后,就自动结束输入。这里结果是value为12,value2为3。
#-p :用于给出提示符,在前面的例子中我们使用了echo –n “…“来给出提示符,可以使用read –p ‘… my promt?’value的方式只需一个语句来表示。
#-r :在参数输入中,我们可以使用’/’表示没有输入完,换行继续输入,如果我们需要行最后的’/’作为有效的字符,可以通过-r来进行。此外在输入字符中,我们希望/n这类特殊字符生效,也应采用-r选项。
#-s :不讲输入内容显示。最典型的就是输密码。
#-t :用于表示等待输入的时间,单位为秒,等待时间超过,将继续执行后面的脚本,注意不作为null输入,参数将保留原有的值
[root@group7 new]# vim hello.sh
#!/bin/bash
num=10
echo $num
read num2
echo "num2的值为$num2"
[root@group7 new]# sh hello.sh
10
2
num2的值为2

        当我们在键盘上输入值时,为了使用户有更好的体验,往往会进行输入提示;那么shell脚本能不能也进行提示呢?答案是当然可以。

        我们只需要在 read 后面加 -p ,再输入给定的提示,就可以在用户输入内容时进行提示。话不多说,上案例:

 

 读取多个值

 

 只读变量(readonly)

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。 

 位置变量

             变量                                              说明
     $n    n为数字,$0为脚本名称,$1~$9为参数,10以上需要用{ }包起来,如${10}。
$@将输入参数以空格分开为整体
$*将输入参数作为整体
$#显示参数个数
$$显示当前运行的脚本PID号

 示例: sh a.sh 你 我 他 它 

 变量运算

整数运算 -expr、let

        expr可以运算,并且将结果输出。注意,该命令后需要用空格把运算符和数字分隔开。否则不会输出结果。

        let运算,只能进行运算,不会输出结果。

小数运算bc

        bc运算,可以进行小数运算,并且使用的是交互模式。输入内容后,可以直接得到运算结果。此外,还支持比较运算,真为1,假为0 。若不想进行交互式,则可以使用管道符进行操作。

         还可以使用 scale=xxx,指定保留几位小数。

 运算符号(()),[ ]

3.条件测试

文件测试

 1.检查文件/home/cut.txt文件是否存在

        ①使用脚本操作

         ②使用命令操作

[root@group7 home]# ls
bajie  cut.txt  inotify.sh  mike  monkey.txt  ooo  shaseng  tangseng  wukong
[root@group7 new]#  test -e /home/cut.txt && echo "The command $_ found." || echo "The command $_ not found."
the /home/cut.txt is found

# $_指上一个执行的命令的最后一个参数

字符串测试

 数值测试

我们用一个脚本来进行举例

#!/bin/bash
read -p "please enter a value:" a        #输入a,b的值
read -p "please enter b value:" b

if [ $a -eq 5 ]                          #当a=b时,输出a=b
then
        echo "The value $a = 5"
fi

if [ $a -gt $b ]                         #当a>b时,输出a>b
then
        echo "The value $a gt $b"
fi

if [ $a -lt $b ]                         #当a<b时,输出a<b
then
        echo "The value $a lt $b"
fi

if [ $a -ne $b ]                         #当a不等于b时,输出a!=b
then
        echo "The value $a != $b"
fi

 逻辑操作符

#!/bin/bash
read -p "enter a:" a

if [ "$a" -eq 25 ] || [ "$a" -eq 10 ]
then
        echo "test success"
else
        echo "test false"
fi
#或者可以这样写

if [[ $a -eq 25 || $a -eq 10 ]]
then
        echo "test success"
else
        echo "test false"
fi



[root@group7 new]# sh luoji.sh
enter a:25
test success
test success

4. if条件语句

if条件语句语法

格式一:
if [条件1]; then
    执行第一段程序
else
    执行第二段程序
fi
格式二:
if [条件1]; then
    执行第一段程序
elif [条件2];then
执行第二段程序
else
    执行第三段程序
fi

单分支if语句

#!/bin/bash
#提示用户输入密码
read -p "请输入密码:" passwd
#用if判断,只有输出正确时才输出,错误则不输出
if test "$passwd" == "123456"
then
        echo -e "\npassowrd currect"
fi

 多分支语句

我们把上面的单分支语句进行优化,让他输入错误时,也进行输出提示。

#!/bin/bash
#提示用户输入密码
read -p "请输入密码:" passwd
#用if判断
if test "$passwd" == "123456"
then
        echo -e "\npassowrd currect"

elif test "$passwd" == ""
then
        echo -e "your not enter password"

else
        echo -e "\npassword not current"
fi

5. case条件语句

case语句的语法

  1 | case expression in
  2 | PAT1)
  3 |     执行语句
  4 |     ;;
  5 | PAT2)
  6 |     执行语句
  7 |     ;;
  8 | *)
  9 |     默认执行语句
  10|     ;;
  11| esac

 case语句实践

写一个shell脚本,输入数字,返回星期几

#!/bin/bash
read -p "请输入数字,结果返回星期:" week

case $week in
        1)
        echo "星期一";;
        2)
        echo "星期二";;
        3)
        echo "星期三";;
        4)
        echo "星期四";;
        5)
        echo "星期五";;
        6)
        echo "星期六";;
        7)
        echo "星期天";;
        "")
        echo "输入为空";;
esac

6.for循环语句

语法格式

for 变量名 in 取值列表
do
  命令
done

for 循环的次数,取决于 取值列表中的变量的数目

 或者可以使用另外一种写法

 当使用(( ))时,可以使用C语言的一些命令

 for循环显示当前目录下的文件

#!/bin/bash

for i in `ls`
do
    echo $i
done

for循环打印99乘法表

#!/bin/bash
for ((i=1;i<=9;i++))
    do
        for ((j=1;j<=i;j++))
            do
                echo -n -e "$i*$j=$[i*j]\t"
            done
    echo
    done

 7.while循环和until循环

while循环语法

while 条件
do
    代码段
done

while循环示例

#!/bin/bash

i=1
while [ $i -le 10 ]
do
    echo $i
    let i++;
done

until循环语法

        until循环与while循环类似,但是until循环判断条件与while循环相反,只有当until的条件为假时,才会继续运行;条件为真时,会退出循环。

until 条件
do
    程序体
done

until循环示例

#!/bin/bash

var=1
until [ $var -gt 3 ]        #条件为 $var > 3 
do
    echo "$var"
    var=$(( var + 1 ))
done

 8.break,continue和exit

break语句用于从for、while、until等循环退出。

continue语句用于跳过循环体中剩余的命令,直接回到循环顶部,开始下一次循环。

exit语句,退出当前shell

break示例

写一个脚本,从键盘输入数字,为正数时相加,为负数时退出循环,并打印最后结果

#!/bin/bash
sum=0
while read n
do
    if ((n > 0))
    then
        ((sum += n))
    else
        echo "sum小于0"
        break
    fi
done
echo "sum=$sum"

continue示例

写一个脚本,遍历1-10,当为5时,不输出

#!/bin/bash

for i in {1..10}
do
    if [ $i -eq 5 ]
    then
        continue
    else
        echo $i
    fi
done

exit示例

创建 exit.sh 文件,并执行,查看返回值

#!/bin/bash

echo "hello world"
exit 8
echo "ni hao"

#执行脚本
[root@group7 new]# sh exit.sh
hello world
[root@group7 new]# echo $?     #查看返回值
8

9.函数

        当我们使用for循环,if条件判断来写脚本时,常常因为嵌套过多导致,分不清到底在哪一个循环中。这时候,我们能可以使用函数封装,从而使代码更为简洁易懂。

定义函数的格式

#方法一     如果有function关键字,则可以省略括号()
function function_name(){
    函数体
}

#方法二
function_name(){
    函数体
}

调用函数格式

#调用函数时,直接写函数名,后面可以跟参数

案例演示

定义一个函数,计算参数和

#!/bin/bash
function num_sum() {
local sum=0
for i in $@
do
    ((sum+=i))
done
echo  $sum
}
num_sum 10 20 30

#执行文件
[root@group7 new]# sh function.sh
60

函数中的return

return   从函数中返回,用最后状态命令决定返回值

return 0  无错误返回

return 1  有错误返回

函数案例

统计路径下文件数目

#!/bin/bash

sum=0
read -p "请输入路径:" path
cd $path
for i in `ls -r *`
do
    if [ -f $i ]
    then
        let sum++
        echo "filename is: $i"
    fi
done
echo "The file numbres is: $sum"

 shell脚本之猜数字游戏

#!/bin/bash

echo "----- 欢迎登录本游戏 -----"
echo "数字范围为 1-50 之间"
random_num=$(($RANDOM%50+1))
while :
do
    read -p "请输入 1-50 的随机数:" number
    if [[ $number == "" ]]
    then
        echo "输入格式有误,请重新输入"
        continue
    elif [ $number -eq $random_num ]
    then
        echo "猜对了,随机数为 $random_num"
        exit
    elif [ $number -gt $random_num ]
    then
        echo "$number,猜大了,请继续"
    elif [ $number -lt $random_num ]
    then
        echo "$number,猜小了,请继续"
    fi
done
#测试脚本
[root@group7 hanshu]# sh guess_num.sh
----- 欢迎登录本游戏 -----
数字范围为 1-50 之间
请输入 1-50 的随机数:25
25,猜大了,请继续
请输入 1-50 的随机数:15
15,猜大了,请继续
请输入 1-50 的随机数:12
12,猜小了,请继续
请输入 1-50 的随机数:13
13,猜小了,请继续
请输入 1-50 的随机数:14
猜对了,随机数为 14

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

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

相关文章

SPARKSQL3.0-源码剖析全流程导读

SPARKSQL-源码剖析全流程导读 一、处理流程 spark从一条sql语句一步一步转换成物理执行结果&#xff0c;这中间需要经历几个阶段&#xff0c;如下图&#xff1a; 二、各阶段概述 1、Unresolved-未解析阶段 此阶段主要做了两件事&#xff1a; 1、将sql字符串通过antrl4转化…

元数据管理系统

数据治理工具–元数据系统数据服务基础能力之元数据管理元数据管理系统设计 1.元数据概述 1.1 介绍 如果想建设好元数据系统&#xff0c;需要理解元数据系统的相关概念&#xff0c;如数据、数据模型、元数据、元模型、ETL、数据血缘等等。 首先&#xff0c;要清楚数据的定义…

python_函数

一、函数介绍组织好的&#xff0c;可重复使用的&#xff0c;用来实现特定功能的代码段例如&#xff1a;len() 函数--Python内置函数# 已组织好的、可重复使用&#xff0c;针对特定功能 def my_len(data):count 0for i in data:count 1print(f"字符串{data}的长度是{coun…

WebRTC实现一个网页在线录制视频

电脑录制视频几乎不会用到&#xff0c;当有需要的时候就各种找软件找工具&#xff0c;并且都会找免费的。现在市场上肯定有很多符合需求&#xff0c;只是那么偶尔的情况下&#xff0c;而且使用场景不是那么多要求的情况下&#xff0c;一个网页在线直接录屏是不是非常nice。 很…

40Java Runtime类

目录 Runtime类 1.概述 2.常见方法 (1).getRuntime返回环境对象 (2).exit停止虚拟机 (3).availableProcessors返回线程数 (4). maxMemory返回获得最大内存 (5).totalMemory返回已经获得内存 (6).freeMemory返回剩余内存 (7).exec运行cmd命令 Runtime类 1.概述 ​ Run…

双亲委派模型机制

文章目录类加载器findClassloadClassJDK双亲委派的破坏第一次破坏第二次破坏tomcat热部署JDK9最新改动双亲委派机制是当类加载器需要加载某一个.class字节码文件时&#xff0c;则首先会把这个任务委托给他的上级类加载器&#xff0c;递归这个操作&#xff0c;如果上级没有加载该…

卷积神经网络<二>keras实现多分支输入VGG

VGG的模型图 VGG使用Keras实现 这里的代码借鉴了VGG实现Keras&#xff0c;但是这段代码不支持多通道&#xff0c;并且vgg函数的扩展性不好。下面修改一下&#xff0c;方便进行多分支图片输入的建立&#xff0c;以及更见方便的调参。 # from keras.models import from keras.l…

MyBatis介绍

MyBatis介绍 MyBatis 是一款优秀的持久层框架&#xff0c;它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息&#xff0c;将接口和 Java 的 POJOs(Plain Ordi…

PMP考试自学可以吗?(含PMP备考资料)

当然是可以的&#xff0c;只要解决了“报考的35学时”这个问题&#xff0c;就只剩怎么备考的问题了。 在一般情况下&#xff0c;建议备考一到三个月&#xff0c;别给自己太长或太短的备考时间&#xff0c;前者坚持不下来&#xff0c;后者备考时间太少&#xff0c;来不及备考充…

戴尔大步进军经典量子计算混合模型

​ &#xff08;图片来源&#xff1a;网络&#xff09; 戴尔正将量子计算机融入传统IT的基础架构中&#xff0c;并向新型加速计算机开放了数据中心。这家服务器制造商为传统服务器基础设施创建了一个蓝图&#xff0c;以满足量子系统的独特需求&#xff0c;量子系统速度要比经典…

基于物联网的汽车爆胎预警系统

本设计是基于物联网的汽车爆胎预警系统的设计与实现设计&#xff0c;主要实现以下功能&#xff1a; 1&#xff0c;主机用LCD1602显示温度、气压和距离&#xff1b; 2&#xff0c;主从机间通过ZigBee进行数据的传输&#xff1b; 3&#xff0c;从机检测轮胎气压&#xff0c;温度…

zbxtable

ubuntu install zbxtable 1.新建zbxtable文件夹&#xff0c;将三件套下载到本地存放 mkdir ~/zbxtable ZbxTable: https://dl.cactifans.com/zbxtable/zbxtable-2.1.0.tar.gz ZbxTable-Web: https://dl.cactifans.com/zbxtable/web.tar.gz MS-Agent: https://dl.cactifans.co…

MybatisMybatisPlusSpringboot之最全入门学习教程笔记

1 Mybatis概述 1.1 Mybatis概念 MyBatis 是一款优秀的持久层框架&#xff0c;用于简化 JDBC 开发, &#xff08;1&#xff09;持久层&#xff1a;负责将数据到保存到数据库的那一层代码。Mybatis就是对jdbc代码进行了封装。 JavaEE三层架构&#xff1a;表现层、业务层、持久层…

ftp协议主动模式与被动模式

FTP主动模式与被动模式 主动模式&#xff1a;客户端给服务端的21控制端口发命令说&#xff0c;我要下载什么什么&#xff0c;并且还会说我已经打开了自己的某个端口&#xff0c;你就从这里把东西给我吧&#xff0c;服务器知道后就会连接客户端已打开的那个数据端口把东西传给客…

SpringBoot配置https

1.Https配置 由于HTTPS具有良好的安全性&#xff0c;在开发中得到了越来越广泛的应用&#xff0c;像微信公众号、小程序等的开发都要使用HTTPS来完成。对于个人开发者而言&#xff0c;一个HTTPS 证书的价格还是有点贵&#xff0c;但是呢&#xff0c;国内的一些云服务器厂商提供…

android studio 项目生成apk的几个问题(备忘)

终于自己做的一个小东西要做完了&#xff0c;最后一步是生成apk&#xff0c;这之前遇到几个问题备忘一下。 1、安装完成后有两个图标&#xff0c;分别是两个activity&#xff0c;卸载一个&#xff0c;另一个也没了。 原因&#xff1a;我原来做一时候没有欢迎界面&#xff0c;…

总结数据结构常用树

树&#xff1a;只有一个根节点&#xff0c;有孩子结点&#xff0c;父节点 二叉树&#xff1a;每个节点最多有两个孩子结点。 二分搜索树&#xff1a;也叫二叉排序树&#xff0c;首先它是一颗二叉树&#xff0c;且左右孩子都存在时&#xff0c;左孩子都小于当前节点值&#xf…

计算机数制(进制转换,原码,反码,补码,真值)

目录 区分进制 带小数点的进制转化 进制转换练习 符号数的表示方法 区分&#xff1a; 考点&#xff1a;给你原码转换补码&#xff0c;补码最负的数的表示&#xff0c;0的表示 原码&#xff0c;反码&#xff0c;补码练习 区分进制 注意微机原理这门课用的是后缀的方式&#xff0…

小学生python游戏编程arcade----碰撞精灵消失问题

小学生python游戏编程arcade----碰撞精灵消失问题前言碰撞精灵消失问题1、多余的精灵不能及时消失1.1 问题1.2 失败代码1.3 记录备忘1.4 代码实现2、放置位置2.1 代码放在ondraw中可以2.2 在update中也可以2.3 碰撞中3、玩家子弹击中敌坦克后的爆炸效果3.1 爆炸类3.2 爆炸列表准…

2022年铁路行业研究报告

第一章 行业概况 铁路运输是主要的陆上交通运输方式之一&#xff0c;铁路是指在综合交通运输体系中&#xff0c;用于运行火车等交通工具行驶的轨道线路。铁路运输是主要的陆上交通运输方式之一&#xff0c;是通过机车牵引车辆组成列车在铁轨上运送客或货的一种运输方式。相比其…