(P7)shell编程入门第7讲:函数:字符串操作 ,一些内置命令:expr、shift、eval、trap等 ,Shell内置命令总结

本文主要是介绍(P7)shell编程入门第7讲:函数:字符串操作 ,一些内置命令:expr、shift、eval、trap等 ,Shell内置命令总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 1.函数的使用
    • 2.字符串操作
    • 3.一些内置命令:expr、shift、eval、trap等
    • 4.Shell内置命令总结

1.函数的使用

  • 和其它编程语言一样,Bash也可以定义函数
  • 一个函数就是一个子程序,用于完成特定的任务,当有重复代码,或者一个任务只需要很少的修改就被重复几次执行时,这时你应该考虑使用函数
  • 函数的一般格式为
function function_name
{commands
}推荐使用下面的方式
function_name ()
{commands
}
  • 函数eg
    (1)只需要输入函数名即可调用该函数
    (2)函数必须在调用之前定义
#!/bin/bashfun()
{echo "Entering function"echo "Exiting function"
}
fun

在这里插入图片描述

  • 函数参数传递eg
#!/bin/bash
func1()
{echo "the parameter count: $#" $#参数个数echo "fist para: $1"	$1第一个参数echo "second para: $2"	$2第二个参数
}func1 a b

在这里插入图片描述

  • shell调用其它shell中的函数
    vim tool.sh
#!/bin/bash
test()
{echo "hello world"
}

vim fun.sh

#!/bin/bash
. tool		##点号表示包含tool文件,相当于C语言中include头文件
test		##调用test函数

在这里插入图片描述

2.字符串操作

  • 字符串操作
${#var} 	返回字符串变量var的长度
${var:m}	返回${var}中从第m个字符到最后的部分,m从0开始,m的取值从0到${#var}
${var:m:len}	返回${var}中从第m个字符开始,长度为len的部分
${var#pattern}	删除${var}中开头部分与pattern匹配的最小部分
${var##pattern}	删除${var}中开头部分与pattern匹配的最大部分
${var%pattern}	删除${var}中结尾部分与pattern匹配的最小部分
${var%%pattern}		删除${var}中结尾部分与pattern匹配的最大部分
${var/old/new}new替换${var}中第一次出现的old
${var//old/new}	用new替换${var}中所有的old(全局替换)注意:pattern,old中可以使用通配符
  • 测试:
#!/bin/bashvar="/aa/bb/cc"
result1=${var#*/}
result2=${var##*/}
result3=${var%/*}
result4=${var%%/*}
echo $var
echo '${var#*/}'=$result1
echo '${var##*/}'=$result2
echo '${var%/*}'=$result3
echo '${var%%/*}'=$result4

在这里插入图片描述
在这里插入图片描述

3.一些内置命令:expr、shift、eval、trap等

  • 生成随机数的特殊变量
echo $RANDOM
  • expr:通用的表达式计算命令
    表达式中参数与操作符必须以空格分开,表达式中的运算可以是算数运算,比较运算,字符串运算和逻辑运算。
expr 5 % 3
expr 5 \ 3   
#乘法符号必须被转义注意:目前用的少,可用$[...]替换
  • shift命令
    (1)一般用于函数或者脚本程序参数出来,特别是参数多余10以上的时候
    (2)将所有参数变量向下移动一个位置,$2变成$1,$3变成$2,依次递进,但是$0保持不变($0是脚本名称)
  • eg:
#!/bin/bashwhile [ "$1" != "" ]
doecho $1shift
done
  • 测试:
    在这里插入图片描述

  • eg:

#!/bin/bashwhile [ "$1" != "" ]
doecho $*shift
done
  • 测试:
    将参数循环一遍,并打印
    $*表示所有的参数列表
    在这里插入图片描述

  • eval命令
    将所有的参数连接成一个表达式,并计算或执行该表达式,参数中的任何变量都将被展开。

eval arg1 [arg2] ... [argN]listpage="ls -l | more"
$listpagelistpage="ls -l | more"
eval $listpage
  • eg:
#!/bin/bash
cmd=
if [ "$1" == "1" ];thencmd="ls"
elsecmd="ls -l"
fieval $cmd
  • 测试:
    eval使得要执行的命令具有动态性
    在这里插入图片描述

  • trap命令
    (1)trap:捕获信号的意思
    (2)信号是软中断,使得程序有了异步处理的能力。
    (3)当程序顺序执行下来的时候,如果发生信号,将转去执行信号所关联的操作。
    (4)trap可以对信号的操作进行关联

trap command signalcommand
一般情况下是Linux命令
’ ’表示发生陷阱时为空指令,不做任何动作
’-’表示发生陷阱时采用缺省指令signal
HUP(1)	挂起;一般因终端掉线或用户退出而引发
INT(2)	中断;一般因按下”Ctrl+C”组合键引发
QUIT(3)	退出;一般因按下”Ctrl+\”组合键引发
ABRT(6)	异常中止;一般因某些严重的执行错误而引发
ALRM(14)	闹钟;一般是超时时钟到来而引发
TREM(15)	中止;一般由系统在关机的时候发出
  • eg:
#!/bin/bash
#安装23号信号
#处理代码为"rm -f tmp$$;exit 0“ 
trap "rm -f tmp$$;exit 0" 2 3
#生成文件,文件名为tmp+当前进程号
touch tmp$$
#睡眠60秒,以便向当前进程发送信号
sleep 60exit 0表示退出当前进程
$$表示当前进程号
当2号信号和3号信号来的时候,会执行rm -f tmp$$;exit 0
  • 测试:
    在这里插入图片描述
    在这里插入图片描述
    按下ctrl + C,产生2号信号,2号信号的动作是删除文件,并退出当前进程.
    tmp21065文件已经不存在了
    在这里插入图片描述

  • eg:锁屏程序

#!/bin/bash
trap "nice_try" 2  3 15
TTY=`tty`
nice_tty()
{echo -e "\nNice try, the terminal stays locked"
}
##stty -echo 			表示输入不明显,就是输入密码12345的时候,不显示
echo -n "Enter your password to lock $TTY:"
read PASSWORD		##这里要输入正确的密码
clear
echo -n "Enter your password to unlock $TTY:"
while :
doread RESPONSEif [ "$RESPONSE" == "$PASSWORD" ];thenecho "unlocking"breakficlearecho "wrong passord and terminal is locked..."echo -n "Enter your password to unlock $TTY:"
done
##stty echo 结束时,恢复明显
  • 测试:
    继续按下ctrl C也无法打断程序,除非输入正确的命令才可以解锁

在这里插入图片描述
在这里插入图片描述

4.Shell内置命令总结

内置命令命令说明
echo输出一行文本到标准输出设备
read从标准输入设备读入数据
printf格式化输出
declare定义或创建变量或数组
let让未定义的变量参与算数运算
expr执行表达式
shift把所有参数变量向下移动一个位置
eval执行命令
trap用来定义接收OS信号后而采取的动作
exit退出SHELL程序
sleep睡眠
test条件测试

这篇关于(P7)shell编程入门第7讲:函数:字符串操作 ,一些内置命令:expr、shift、eval、trap等 ,Shell内置命令总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1041406

相关文章

MySQL游标和触发器的操作流程

《MySQL游标和触发器的操作流程》本文介绍了MySQL中的游标和触发器的使用方法,游标可以对查询结果集进行逐行处理,而触发器则可以在数据表发生更改时自动执行预定义的操作,感兴趣的朋友跟随小编一起看看... 目录游标游标的操作流程1. 定义游标2.打开游标3.利用游标检索数据4.关闭游标例题触发器触发器的基

Python容器转换与共有函数举例详解

《Python容器转换与共有函数举例详解》Python容器是Python编程语言中非常基础且重要的概念,它们提供了数据的存储和组织方式,下面:本文主要介绍Python容器转换与共有函数的相关资料,... 目录python容器转换与共有函数详解一、容器类型概览二、容器类型转换1. 基本容器转换2. 高级转换示

在C#中分离饼图的某个区域的操作指南

《在C#中分离饼图的某个区域的操作指南》在处理Excel饼图时,我们可能需要将饼图的各个部分分离出来,以使它们更加醒目,Spire.XLS提供了Series.DataFormat.Percent属性,... 目录引言如何设置饼图各分片之间分离宽度的代码示例:从整个饼图中分离单个分片的代码示例:引言在处理

Java实现字符串大小写转换的常用方法

《Java实现字符串大小写转换的常用方法》在Java中,字符串大小写转换是文本处理的核心操作之一,Java提供了多种灵活的方式来实现大小写转换,适用于不同场景和需求,本文将全面解析大小写转换的各种方法... 目录前言核心转换方法1.String类的基础方法2. 考虑区域设置的转换3. 字符级别的转换高级转换

Python列表的创建与删除的操作指南

《Python列表的创建与删除的操作指南》列表(list)是Python中最常用、最灵活的内置数据结构之一,它支持动态扩容、混合类型、嵌套结构,几乎无处不在,但你真的会创建和删除列表吗,本文给大家介绍... 目录一、前言二、列表的创建方式1. 字面量语法(最常用)2. 使用list()构造器3. 列表推导式

MySQL字符串转数值的方法全解析

《MySQL字符串转数值的方法全解析》在MySQL开发中,字符串与数值的转换是高频操作,本文从隐式转换原理、显式转换方法、典型场景案例、风险防控四个维度系统梳理,助您精准掌握这一核心技能,需要的朋友可... 目录一、隐式转换:自动但需警惕的&ld编程quo;双刃剑”二、显式转换:三大核心方法详解三、典型场景

Go异常处理、泛型和文件操作实例代码

《Go异常处理、泛型和文件操作实例代码》Go语言的异常处理机制与传统的面向对象语言(如Java、C#)所使用的try-catch结构有所不同,它采用了自己独特的设计理念和方法,:本文主要介绍Go异... 目录一:异常处理常见的异常处理向上抛中断程序恢复程序二:泛型泛型函数泛型结构体泛型切片泛型 map三:文

C# List.Sort四种重载总结

《C#List.Sort四种重载总结》本文详细分析了C#中List.Sort()方法的四种重载形式及其实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录1. Sort方法的四种重载2. 具体使用- List.Sort();- IComparable

SpringBoot项目整合Netty启动失败的常见错误总结

《SpringBoot项目整合Netty启动失败的常见错误总结》本文总结了SpringBoot集成Netty时常见的8类问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一、端口冲突问题1. Tomcat与Netty端口冲突二、主线程被阻塞问题1. Netty启动阻

SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)

《SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)》本文总结了SpringBoot项目整合Kafka启动失败的常见错误,包括Kafka服务器连接问题、序列化配置错误、依赖配置问题、... 目录一、Kafka服务器连接问题1. Kafka服务器无法连接2. 开发环境与生产环境网络不通二、序